// This file is part of OpenTSDB.
// Copyright (C) 2013 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.meta;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import net.opentsdb.core.BaseTsdbTest;
import net.opentsdb.core.IncomingDataPoint;
import net.opentsdb.core.TSDB;
import net.opentsdb.storage.MockBase;
import net.opentsdb.uid.NoSuchUniqueId;
import net.opentsdb.uid.NoSuchUniqueName;
import net.opentsdb.uid.UniqueId;
import net.opentsdb.utils.Config;
import net.opentsdb.utils.DateTime;
import org.hbase.async.AtomicIncrementRequest;
import org.hbase.async.Bytes;
import org.hbase.async.DeleteRequest;
import org.hbase.async.GetRequest;
import org.hbase.async.HBaseClient;
import org.hbase.async.KeyValue;
import org.hbase.async.PutRequest;
import org.hbase.async.Scanner;
import org.hbase.async.Bytes.ByteMap;
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 org.powermock.reflect.Whitebox;
import com.stumbleupon.async.DeferredGroupException;
@PowerMockIgnore({"javax.management.*", "javax.xml.*",
"ch.qos.*", "org.slf4j.*",
"com.sum.*", "org.xml.*"})
@RunWith(PowerMockRunner.class)
@PrepareForTest({TSDB.class, Config.class, UniqueId.class, HBaseClient.class,
GetRequest.class, PutRequest.class, DeleteRequest.class, KeyValue.class,
Scanner.class, TSMeta.class, AtomicIncrementRequest.class, DateTime.class })
public final class TestTSUIDQuery extends BaseTsdbTest {
private final static byte[] NAME_FAMILY = "name".getBytes(MockBase.ASCII());
private final static byte[] META_TABLE = "tsdb-meta".getBytes(MockBase.ASCII());
private final static byte[] UID_TABLE = "tsdb-uid".getBytes(MockBase.ASCII());
private static final byte[] TSUID = new byte[] { 0, 0, 1, 0, 0, 1, 0, 0, 1 };
private static final byte[] QUAL = new byte[] { 0, 0 };
private static final byte[] VAL = new byte[] { 0x2A };
private TSUIDQuery query;
@Before
public void beforeLocal() throws Exception {
storage = new MockBase(tsdb, client, true, true, true, true);
setupStorage(tsdb, storage);
}
@Test
public void ctorDefault() throws Exception {
query = new TSUIDQuery(tsdb);
assertNotNull(query);
}
@Test (expected = IllegalArgumentException.class)
public void ctorNullTSDB() throws Exception {
query = new TSUIDQuery(null);
}
@Test
public void ctorTSUID() throws Exception {
query = new TSUIDQuery(tsdb, TSUID);
assertNotNull(query);
}
@Test (expected = IllegalArgumentException.class)
public void ctorNullTSUID() throws Exception {
query = new TSUIDQuery(tsdb, null);
}
@Test (expected = IllegalArgumentException.class)
public void ctorNullTSDBforTSUID() throws Exception {
query = new TSUIDQuery(null, TSUID);
}
@Test (expected = IllegalArgumentException.class)
public void ctorEmptyTSUID() throws Exception {
query = new TSUIDQuery(tsdb, new byte[] { });
}
@Test (expected = IllegalArgumentException.class)
public void ctorShortTSUID() throws Exception {
query = new TSUIDQuery(tsdb, new byte[] { 0, 0, 1, 0, 0, 1 });
}
@Test
public void ctorMetric() throws Exception {
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
assertNotNull(query);
}
@Test (expected = IllegalArgumentException.class)
public void ctorMetricNullTSDB() throws Exception {
query = new TSUIDQuery(null, METRIC_STRING, tags);
}
@Test (expected = IllegalArgumentException.class)
public void ctorMetricNullMetric() throws Exception {
query = new TSUIDQuery(tsdb, null, tags);
}
@Test (expected = IllegalArgumentException.class)
public void ctorMetricEmptyMetric() throws Exception {
query = new TSUIDQuery(tsdb, "", tags);
}
@Test (expected = IllegalArgumentException.class)
public void ctorMetricNullTags() throws Exception {
query = new TSUIDQuery(tsdb, METRIC_STRING, null);
}
@Test
public void ctorMetricEmptyTags() throws Exception {
tags.clear();
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
assertNotNull(query);
}
@Test
public void getLastWriteTimes() throws Exception {
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
final ByteMap<Long> tsuids = query.getLastWriteTimes().joinUninterruptibly();
assertEquals(1, tsuids.size());
assertEquals(1388534400013L, (long)tsuids.get(TSUID));
}
@Test
public void getLastWriteTimesSetQuery() throws Exception {
query = new TSUIDQuery(tsdb);
query.setQuery(METRIC_STRING, tags);
final ByteMap<Long> tsuids = query.getLastWriteTimes().joinUninterruptibly();
assertEquals(1, tsuids.size());
assertEquals(1388534400013L, (long)tsuids.get(TSUID));
}
@Test
public void getLastWriteTimesEmptyTags() throws Exception {
tags.clear();
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
final ByteMap<Long> tsuids = query.getLastWriteTimes().joinUninterruptibly();
assertEquals(2, tsuids.size());
assertEquals(1388534400013L, (long)tsuids.get(TSUID));
assertEquals(1388534400015L,
(long)tsuids.get(new byte[] { 0, 0, 1, 0, 0, 1, 0, 0, 2 }));
}
@Test
public void getLastWriteTimesEmptyTagsSetQuery() throws Exception {
tags.clear();
query = new TSUIDQuery(tsdb);
query.setQuery(METRIC_STRING, tags);
final ByteMap<Long> tsuids = query.getLastWriteTimes().joinUninterruptibly();
assertEquals(2, tsuids.size());
assertEquals(1388534400013L, (long)tsuids.get(TSUID));
assertEquals(1388534400015L,
(long)tsuids.get(new byte[] { 0, 0, 1, 0, 0, 1, 0, 0, 2 }));
}
@Test (expected = IllegalArgumentException.class)
public void getLastWriteTimesQueryNotSet() throws Exception {
query = new TSUIDQuery(tsdb);
query.getLastWriteTimes().joinUninterruptibly();
}
@Test
public void getLastWriteTimesNoMatch() throws Exception {
storage.flushStorage();
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
final ByteMap<Long> tsuids = query.getLastWriteTimes().joinUninterruptibly();
assertTrue(tsuids.isEmpty());
}
@Test (expected = NoSuchUniqueName.class)
public void getLastWriteTimesNSUNMetric() throws Exception {
query = new TSUIDQuery(tsdb, NSUN_METRIC, tags);
query.getLastWriteTimes().joinUninterruptibly();
}
@Test (expected = DeferredGroupException.class)
public void getLastWriteTimesNSUNTagk() throws Exception {
tags.clear();
tags.put("dc", TAGV_STRING);
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
query.getLastWriteTimes().joinUninterruptibly();
}
@Test (expected = DeferredGroupException.class)
public void getLastWriteTimesNSUNTagv() throws Exception {
tags.put(TAGK_STRING, "web03");
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
query.getLastWriteTimes().joinUninterruptibly();
}
@Test
public void getTSMetasSingle() throws Exception {
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
final List<TSMeta> tsmetas = query.getTSMetas().joinUninterruptibly();
assertEquals(1, tsmetas.size());
assertEquals(METRIC_STRING, tsmetas.get(0).getMetric().getName());
assertEquals(TAGK_STRING, tsmetas.get(0).getTags().get(0).getName());
assertEquals(TAGV_STRING, tsmetas.get(0).getTags().get(1).getName());
}
@Test
public void getTSMetasSingleSetQuery() throws Exception {
query = new TSUIDQuery(tsdb);
query.setQuery(METRIC_STRING, tags);
final List<TSMeta> tsmetas = query.getTSMetas().joinUninterruptibly();
assertEquals(1, tsmetas.size());
assertEquals(METRIC_STRING, tsmetas.get(0).getMetric().getName());
assertEquals(TAGK_STRING, tsmetas.get(0).getTags().get(0).getName());
assertEquals(TAGV_STRING, tsmetas.get(0).getTags().get(1).getName());
}
@Test
public void getTSMetasMultipleResults() throws Exception {
tags.clear();
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
final List<TSMeta> tsmetas = query.getTSMetas().joinUninterruptibly();
assertEquals(2, tsmetas.size());
assertEquals(METRIC_STRING, tsmetas.get(0).getMetric().getName());
assertEquals(TAGK_STRING, tsmetas.get(0).getTags().get(0).getName());
assertEquals(TAGV_STRING, tsmetas.get(0).getTags().get(1).getName());
assertEquals(METRIC_STRING, tsmetas.get(1).getMetric().getName());
assertEquals(TAGK_STRING, tsmetas.get(1).getTags().get(0).getName());
assertEquals(TAGV_B_STRING, tsmetas.get(1).getTags().get(1).getName());
}
@Test
public void getTSMetasMultipleTags() throws Exception {
tags.put(TAGK_B_STRING, TAGV_B_STRING);
query = new TSUIDQuery(tsdb, METRIC_B_STRING, tags);
final List<TSMeta> tsmetas = query.getTSMetas().joinUninterruptibly();
assertEquals(1, tsmetas.size());
assertEquals(METRIC_B_STRING, tsmetas.get(0).getMetric().getName());
assertEquals(TAGK_STRING, tsmetas.get(0).getTags().get(0).getName());
assertEquals(TAGV_STRING, tsmetas.get(0).getTags().get(1).getName());
assertEquals(TAGK_B_STRING, tsmetas.get(0).getTags().get(2).getName());
assertEquals(TAGV_B_STRING, tsmetas.get(0).getTags().get(3).getName());
}
@Test (expected = DeferredGroupException.class)
public void getTSMetasNSUITagk() throws Exception {
tags.put(NSUN_TAGK, TAGV_B_STRING);
query = new TSUIDQuery(tsdb, METRIC_B_STRING, tags);
query.getTSMetas().joinUninterruptibly();
}
@Test (expected = IllegalArgumentException.class)
public void getTSMetasNullMetric() throws Exception {
query = new TSUIDQuery(tsdb);
query.getTSMetas().joinUninterruptibly();
}
@Test
public void tsuidFromMetric() throws Exception {
byte[] tsuid = TSUIDQuery.tsuidFromMetric(tsdb, METRIC_STRING, tags).join();
assertArrayEquals(TSUID, tsuid);
}
@Test
public void tsuidFromMetricTwoTags() throws Exception {
tags.put(TAGK_B_STRING, TAGV_B_STRING);
byte[] tsuid = TSUIDQuery.tsuidFromMetric(tsdb, METRIC_STRING, tags).join();
assertArrayEquals(
new byte[] { 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 3, 0, 0, 2 }, tsuid);
}
@Test (expected = NoSuchUniqueName.class)
public void tsuidFromMetricNSUNMetric() throws Exception {
TSUIDQuery.tsuidFromMetric(tsdb, NSUN_METRIC, tags).join();
}
@Test (expected = DeferredGroupException.class)
public void tsuidFromMetricNSUNTagk() throws Exception {
tags.clear();
tags.put("dc", TAGV_STRING);
TSUIDQuery.tsuidFromMetric(tsdb, METRIC_STRING, tags).join();
}
@Test (expected = DeferredGroupException.class)
public void tsuidFromMetricNSUNTagv() throws Exception {
tags.put(TAGK_STRING, "web03");
TSUIDQuery.tsuidFromMetric(tsdb, METRIC_STRING, tags).join();
}
@Test (expected = NullPointerException.class)
public void tsuidFromMetricNullTSDB() throws Exception {
TSUIDQuery.tsuidFromMetric(null, METRIC_STRING, tags).join();
}
@Test (expected = IllegalArgumentException.class)
public void tsuidFromMetricNullMetric() throws Exception {
TSUIDQuery.tsuidFromMetric(tsdb, null, tags).join();
}
@Test (expected = IllegalArgumentException.class)
public void tsuidFromMetricEmptyMetric() throws Exception {
TSUIDQuery.tsuidFromMetric(tsdb, "", tags).join();
}
@Test (expected = IllegalArgumentException.class)
public void tsuidFromMetricNullTags() throws Exception {
TSUIDQuery.tsuidFromMetric(tsdb, METRIC_STRING, null).join();
}
@Test (expected = IllegalArgumentException.class)
public void tsuidFromMetricEmptyTags() throws Exception {
tags.clear();
TSUIDQuery.tsuidFromMetric(tsdb, METRIC_STRING, tags).join();
}
@Test
public void getLastPointMetricZeroBackscanOnePoint() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
tsdb.addPoint(METRIC_STRING, 1356998400L, 42, tags);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
final IncomingDataPoint dp = query.getLastPoint(false, 0).join();
assertEquals(1356998400000L, dp.getTimestamp());
assertNull(dp.getMetric());
assertNull(dp.getTags());
assertEquals("42", dp.getValue());
assertEquals(UniqueId.uidToString(TSUID), dp.getTSUID());
}
@Test
public void getLastPointMetricZeroBackscanMostRecent() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
tsdb.addPoint(METRIC_STRING, 1356998400L, 42, tags);
tsdb.addPoint(METRIC_STRING, 1356998401L, 24, tags);
tsdb.addPoint(METRIC_STRING, 1356998402L, 1, tags);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
final IncomingDataPoint dp = query.getLastPoint(false, 0).join();
assertEquals(1356998402000L, dp.getTimestamp());
assertNull(dp.getMetric());
assertNull(dp.getTags());
assertEquals("1", dp.getValue());
assertEquals(UniqueId.uidToString(TSUID), dp.getTSUID());
}
@Test
public void getLastPointMetricZeroBackscanOutOfRange() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
tsdb.addPoint(METRIC_STRING, 1356998400L, 42, tags);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1357002000000L);
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
assertNull(query.getLastPoint(false, 0).join());
}
@Test
public void getLastPointMetricOneBackscanInRange() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
tsdb.addPoint(METRIC_STRING, 1356998400L, 42, tags);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1357002000000L);
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
final IncomingDataPoint dp = query.getLastPoint(false, 1).join();
assertEquals(1356998400000L, dp.getTimestamp());
assertNull(dp.getMetric());
assertNull(dp.getTags());
assertEquals("42", dp.getValue());
assertEquals(UniqueId.uidToString(TSUID), dp.getTSUID());
}
@Test
public void getLastPointMetricOneBackscanOutOfRange() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
tsdb.addPoint(METRIC_STRING, 1356998400L, 42, tags);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1357010600000L);
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
assertNull(query.getLastPoint(false, 1).join());
}
@Test
public void getLastPointMetricManyBackscanInRange() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
tsdb.addPoint(METRIC_STRING, 1356998400L, 42, tags);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1360681200000L);
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
final IncomingDataPoint dp = query.getLastPoint(false, 1024).join();
assertEquals(1356998400000L, dp.getTimestamp());
assertNull(dp.getMetric());
assertNull(dp.getTags());
assertEquals("42", dp.getValue());
assertEquals(UniqueId.uidToString(TSUID), dp.getTSUID());
}
@Test
public void getLastPointMetricManyBackscanOutOfRange() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
tsdb.addPoint(METRIC_STRING, 1356998400L, 42, tags);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1360681200000L);
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
assertNull(query.getLastPoint(false, 1022).join());
}
@Test (expected = IllegalArgumentException.class)
public void getLastPointMetricNegativeBackscan() throws Exception {
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
query.getLastPoint(false, -1).join();
}
@Test
public void getLastPointMetricResolve() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
tsdb.addPoint(METRIC_STRING, 1356998400L, 42, tags);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
final IncomingDataPoint dp = query.getLastPoint(true, 0).join();
assertEquals(1356998400000L, dp.getTimestamp());
assertEquals(METRIC_STRING, dp.getMetric());
assertSame(tags, dp.getTags());
assertEquals("42", dp.getValue());
assertEquals(UniqueId.uidToString(TSUID), dp.getTSUID());
}
@Test (expected = NoSuchUniqueName.class)
public void getLastPointMetricNSUNMetric() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
tsdb.addPoint(NSUN_METRIC, 1356998400L, 42, tags);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
query.getLastPoint(false, 0).join();
}
@Test (expected = DeferredGroupException.class)
public void getLastPointMetricNSUNTagk() throws Exception {
tags.clear();
tags.put(NSUN_TAGK, TAGV_STRING);
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
query.getLastPoint(false, 0).join();
}
@Test (expected = DeferredGroupException.class)
public void getLastPointMetricNSUNTagv() throws Exception {
tags.put(TAGK_STRING, NSUN_TAGV);
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
query.getLastPoint(false, 0).join();
}
@Test (expected = IllegalArgumentException.class)
public void getLastPointMetricEmptyTags() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
tags.clear();
tsdb.addPoint(METRIC_STRING, 1356998400L, 42, tags);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
query = new TSUIDQuery(tsdb, METRIC_STRING, tags);
query.getLastPoint(false, 0).join();
}
@Test
public void getLastPointTSUIDZeroBackscanRecent() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
tsdb.addPoint(METRIC_STRING, 1356998400L, 42, tags);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
query = new TSUIDQuery(tsdb, TSUID);
final IncomingDataPoint dp = query.getLastPoint(false, 0).join();
assertEquals(1356998400000L, dp.getTimestamp());
assertNull(dp.getMetric());
assertNull(dp.getTags());
assertEquals("42", dp.getValue());
assertEquals(UniqueId.uidToString(TSUID), dp.getTSUID());
}
@Test
public void getLastPointTSUIDZeroBackscanRecentOutOfRange() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
tsdb.addPoint(METRIC_STRING, 1356998400L, 42, tags);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1357002000000L);
query = new TSUIDQuery(tsdb, TSUID);
assertNull(query.getLastPoint(false, 0).join());
}
@Test
public void getLastPointTSUIDOneBackscanInRange() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
tsdb.addPoint(METRIC_STRING, 1356998400L, 42, tags);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1357002000000L);
query = new TSUIDQuery(tsdb, TSUID);
final IncomingDataPoint dp = query.getLastPoint(false, 1).join();
assertEquals(1356998400000L, dp.getTimestamp());
assertNull(dp.getMetric());
assertNull(dp.getTags());
assertEquals("42", dp.getValue());
assertEquals(UniqueId.uidToString(TSUID), dp.getTSUID());
}
@Test
public void getLastPointTSUIDOneBackscanRecentOutOfRange() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
tsdb.addPoint(METRIC_STRING, 1356998400L, 42, tags);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1357010600000L);
query = new TSUIDQuery(tsdb, TSUID);
assertNull(query.getLastPoint(false, 1).join());
}
@Test
public void getLastPointTSUIDManyBackscanInRange() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
tsdb.addPoint(METRIC_STRING, 1356998400L, 42, tags);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1360681200000L);
query = new TSUIDQuery(tsdb, TSUID);
final IncomingDataPoint dp = query.getLastPoint(false, 1024).join();
assertEquals(1356998400000L, dp.getTimestamp());
assertNull(dp.getMetric());
assertNull(dp.getTags());
assertEquals("42", dp.getValue());
assertEquals(UniqueId.uidToString(TSUID), dp.getTSUID());
}
@Test
public void getLastPointTSUIDManyBackscanRecentOutOfRange() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
tsdb.addPoint(METRIC_STRING, 1356998400L, 42, tags);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1360681200000L);
query = new TSUIDQuery(tsdb, TSUID);
assertNull(query.getLastPoint(false, 1022).join());
}
// While these NSUI shouldn't happen, it's possible if someone deletes a metric
// or tag but not the actual data.
@Test
public void getLastPointTSUIDMetricNSUINotResolved() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
storage.addColumn(MockBase.stringToBytes("00000350E22700000001000001"),
QUAL, VAL);
final byte[] tsuid = new byte[] { 0, 0, 3, 0, 0, 1, 0, 0, 1 };
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
query = new TSUIDQuery(tsdb, tsuid);
final IncomingDataPoint dp = query.getLastPoint(false, 0).join();
assertEquals(1356998400000L, dp.getTimestamp());
assertNull(dp.getMetric());
assertNull(dp.getTags());
assertEquals("42", dp.getValue());
assertEquals(UniqueId.uidToString(tsuid), dp.getTSUID());
}
@Test (expected = NoSuchUniqueId.class)
public void getLastPointTSUIDMetricNSUI() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
storage.addColumn(MockBase.stringToBytes("00000350E22700000001000001"),
QUAL, VAL);
final byte[] tsuid = new byte[] { 0, 0, 3, 0, 0, 1, 0, 0, 1 };
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
query = new TSUIDQuery(tsdb, tsuid);
query.getLastPoint(true, 0).join();
}
@Test
public void getLastPointTSUIDTagkNSUINotResolved() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
storage.addColumn(MockBase.stringToBytes("00000150E22700000003000001"),
QUAL, VAL);
final byte[] tsuid = new byte[] { 0, 0, 1, 0, 0, 3, 0, 0, 1 };
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
query = new TSUIDQuery(tsdb, tsuid);
final IncomingDataPoint dp = query.getLastPoint(false, 0).join();
assertEquals(1356998400000L, dp.getTimestamp());
assertNull(dp.getMetric());
assertNull(dp.getTags());
assertEquals("42", dp.getValue());
assertEquals(UniqueId.uidToString(tsuid), dp.getTSUID());
}
@Test (expected = NoSuchUniqueId.class)
public void getLastPointTSUIDTagkNSUI() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
storage.addColumn(MockBase.stringToBytes("00000150E22700000004000001"),
QUAL, VAL);
final byte[] tsuid = new byte[] { 0, 0, 1, 0, 0, 4, 0, 0, 1 };
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
query = new TSUIDQuery(tsdb, tsuid);
query.getLastPoint(true, 0).join();
}
@Test
public void getLastPointTSUIDTagvNSUINotResolved() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
storage.addColumn(MockBase.stringToBytes("00000150E22700000001000003"),
QUAL, VAL);
final byte[] tsuid = new byte[] { 0, 0, 1, 0, 0, 1, 0, 0, 3 };
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
query = new TSUIDQuery(tsdb, tsuid);
final IncomingDataPoint dp = query.getLastPoint(false, 0).join();
assertEquals(1356998400000L, dp.getTimestamp());
assertNull(dp.getMetric());
assertNull(dp.getTags());
assertEquals("42", dp.getValue());
assertEquals(UniqueId.uidToString(tsuid), dp.getTSUID());
}
@Test (expected = NoSuchUniqueId.class)
public void getLastPoitTSUIDTagvNSUI() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
storage.flushStorage();
storage.addColumn(MockBase.stringToBytes("00000150E22700000001000003"),
QUAL, VAL);
final byte[] tsuid = new byte[] { 0, 0, 1, 0, 0, 1, 0, 0, 3 };
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
query = new TSUIDQuery(tsdb, tsuid);
query.getLastPoint(true, 0).join();
}
@Test
public void getLastPointTSUIDMeta() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", false);
Whitebox.setInternalState(config, "enable_realtime_ts", false);
tsdb.addPoint(METRIC_STRING, 1388534400L, 42, tags);
Whitebox.setInternalState(config, "enable_tsuid_incrementing", true);
Whitebox.setInternalState(config, "enable_realtime_ts", true);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
query = new TSUIDQuery(tsdb, TSUID);
final IncomingDataPoint dp = query.getLastPoint(false, 0).join();
assertEquals(1388534400000L, dp.getTimestamp());
assertNull(dp.getMetric());
assertNull(dp.getTags());
assertEquals("42", dp.getValue());
assertEquals(UniqueId.uidToString(TSUID), dp.getTSUID());
}
@Test
public void getLastPointTSUIDMetaNoPoint() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", true);
Whitebox.setInternalState(config, "enable_realtime_ts", true);
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
query = new TSUIDQuery(tsdb, TSUID);
assertNull(query.getLastPoint(false, 0).join());
}
/**
* Public for sharing with other UT classes
* @param tsdb The mock TSDB client
* @throws Exception If something went pear shaped
*/
public static void setupStorage(final TSDB tsdb, final MockBase storage)
throws Exception {
final List<byte[]> families = new ArrayList<byte[]>();
families.add(TSMeta.FAMILY);
storage.addTable(META_TABLE, families);
storage.addColumn(UID_TABLE, new byte[] { 0, 0, 1 }, NAME_FAMILY,
"metrics".getBytes(MockBase.ASCII()),
METRIC_STRING.getBytes(MockBase.ASCII()));
storage.addColumn(UID_TABLE, new byte[] { 0, 0, 1 }, NAME_FAMILY,
"metric_meta".getBytes(MockBase.ASCII()),
("{\"uid\":\"000001\",\"type\":\"METRIC\",\"name\":\"sys.cpu.user\"," +
"\"description\":\"Description\",\"notes\":\"MyNotes\",\"created\":" +
"1328140801,\"displayName\":\"System CPU\"}")
.getBytes(MockBase.ASCII()));
storage.addColumn(UID_TABLE, new byte[] { 0, 0, 2 }, NAME_FAMILY,
"metrics".getBytes(MockBase.ASCII()),
METRIC_B_STRING.getBytes(MockBase.ASCII()));
storage.addColumn(UID_TABLE, new byte[] { 0, 0, 2 }, NAME_FAMILY,
"metric_meta".getBytes(MockBase.ASCII()),
("{\"uid\":\"000002\",\"type\":\"METRIC\",\"name\":\"sys.cpu.system\"," +
"\"description\":\"Description\",\"notes\":\"MyNotes\",\"created\":" +
"1328140801,\"displayName\":\"System CPU\"}")
.getBytes(MockBase.ASCII()));
storage.addColumn(UID_TABLE, new byte[] { 0, 0, 1 }, NAME_FAMILY,
"tagk".getBytes(MockBase.ASCII()),
TAGK_STRING.getBytes(MockBase.ASCII()));
storage.addColumn(UID_TABLE, new byte[] { 0, 0, 1 }, NAME_FAMILY,
"tagk_meta".getBytes(MockBase.ASCII()),
("{\"uid\":\"000001\",\"type\":\"TAGK\",\"name\":\"host\"," +
"\"description\":\"Description\",\"notes\":\"MyNotes\",\"created\":" +
"1328140801,\"displayName\":\"Host server name\"}")
.getBytes(MockBase.ASCII()));
storage.addColumn(UID_TABLE, new byte[] { 0, 0, 2 }, NAME_FAMILY,
"tagk".getBytes(MockBase.ASCII()),
TAGK_B_STRING.getBytes(MockBase.ASCII()));
storage.addColumn(UID_TABLE, new byte[] { 0, 0, 2 }, NAME_FAMILY,
"tagk_meta".getBytes(MockBase.ASCII()),
("{\"uid\":\"000002\",\"type\":\"TAGK\",\"name\":\"owner\"," +
"\"description\":\"Description\",\"notes\":\"MyNotes\",\"created\":" +
"1328140801,\"displayName\":\"Datecenter name\"}")
.getBytes(MockBase.ASCII()));
storage.addColumn(UID_TABLE, new byte[] { 0, 0, 1 }, NAME_FAMILY,
"tagv".getBytes(MockBase.ASCII()),
TAGV_STRING.getBytes(MockBase.ASCII()));
storage.addColumn(UID_TABLE, new byte[] { 0, 0, 1 }, NAME_FAMILY,
"tagv_meta".getBytes(MockBase.ASCII()),
("{\"uid\":\"000001\",\"type\":\"TAGV\",\"name\":\"web01\"," +
"\"description\":\"Description\",\"notes\":\"MyNotes\",\"created\":" +
"1328140801,\"displayName\":\"Web server 1\"}")
.getBytes(MockBase.ASCII()));
storage.addColumn(UID_TABLE, new byte[] { 0, 0, 2 }, NAME_FAMILY,
"tagv".getBytes(MockBase.ASCII()),
TAGV_B_STRING.getBytes(MockBase.ASCII()));
storage.addColumn(UID_TABLE, new byte[] { 0, 0, 2 }, NAME_FAMILY,
"tagv_meta".getBytes(MockBase.ASCII()),
("{\"uid\":\"000002\",\"type\":\"TAGV\",\"name\":\"web02\"," +
"\"description\":\"Description\",\"notes\":\"MyNotes\",\"created\":" +
"1328140801,\"displayName\":\"Web server 2\"}")
.getBytes(MockBase.ASCII()));
storage.addColumn(META_TABLE, TSUID, NAME_FAMILY,
"ts_meta".getBytes(MockBase.ASCII()),
("{\"tsuid\":\"000001000001000001\",\"" +
"description\":\"Description\",\"notes\":\"Notes\",\"created\":1328140800," +
"\"custom\":null,\"units\":\"\",\"retention\":42,\"max\":1.0,\"min\":" +
"\"NaN\",\"displayName\":\"Display\",\"dataType\":\"Data\"}")
.getBytes(MockBase.ASCII()));
storage.addColumn(META_TABLE, TSUID, NAME_FAMILY,
"ts_ctr".getBytes(MockBase.ASCII()),
Bytes.fromLong(1L));
storage.addColumn(META_TABLE,
new byte[] { 0, 0, 1, 0, 0, 1, 0, 0, 2 }, NAME_FAMILY,
"ts_meta".getBytes(MockBase.ASCII()),
("{\"tsuid\":\"000001000001000002\",\"" +
"description\":\"Description\",\"notes\":\"Notes\",\"created\":1328140800," +
"\"custom\":null,\"units\":\"\",\"retention\":42,\"max\":1.0,\"min\":" +
"\"NaN\",\"displayName\":\"Display\",\"dataType\":\"Data\"}")
.getBytes(MockBase.ASCII()));
storage.addColumn(META_TABLE,
new byte[] { 0, 0, 1, 0, 0, 1, 0, 0, 2 }, NAME_FAMILY,
"ts_ctr".getBytes(MockBase.ASCII()),
Bytes.fromLong(1L));
storage.addColumn(META_TABLE,
new byte[] { 0, 0, 2, 0, 0, 1, 0, 0, 1, 0, 0, 3, 0, 0, 2 },
NAME_FAMILY, "ts_meta".getBytes(MockBase.ASCII()),
("{\"tsuid\":\"000002000001000001000003000002\",\"" +
"description\":\"Description\",\"notes\":\"Notes\",\"created\":1328140800," +
"\"custom\":null,\"units\":\"\",\"retention\":42,\"max\":1.0,\"min\":" +
"\"NaN\",\"displayName\":\"Display\",\"dataType\":\"Data\"}")
.getBytes(MockBase.ASCII()));
storage.addColumn(META_TABLE,
new byte[] { 0, 0, 2, 0, 0, 1, 0, 0, 1, 0, 0, 3, 0, 0, 2 },
NAME_FAMILY, "ts_ctr".getBytes(MockBase.ASCII()),
Bytes.fromLong(1L));
}
}