package com.rackspacecloud.blueflood.io; import com.rackspacecloud.blueflood.io.datastax.DBasicMetricsRW; import com.rackspacecloud.blueflood.outputs.formats.MetricData; import com.rackspacecloud.blueflood.rollup.Granularity; import com.rackspacecloud.blueflood.service.SingleRollupWriteContext; import com.rackspacecloud.blueflood.types.*; import com.rackspacecloud.blueflood.utils.Util; import junitparams.JUnitParamsRunner; import junitparams.Parameters; import java.util.*; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunnerDelegate; import static org.junit.Assert.*; import static org.powermock.api.mockito.PowerMockito.*; import static org.mockito.Matchers.*; /** * Test non-read/write functionality of the datstax driver. */ @PowerMockIgnore({"javax.management.*" }) @RunWith( PowerMockRunner.class ) @PowerMockRunnerDelegate( JUnitParamsRunner.class ) @PrepareForTest( DBasicMetricsRW.class ) public class BasicMetricsRWOtherFuncIntegrationTest extends BasicMetricsRWIntegrationTest { @Test @Parameters(method="getGranularitiesToTest") public void testSingleMetricTtlWorks(Granularity granularity) throws Exception { // pick first locator from input metrics Locator locator = numericMap.keySet().iterator().next(); IMetric expectedMetric = numericMap.get(locator); // put it, with TTL 2 seconds expectedMetric.setTtlInSeconds(2); List<SingleRollupWriteContext> cxts = new ArrayList<SingleRollupWriteContext>(); cxts.add( createSingleRollupWriteContext( granularity, expectedMetric )); // mock getTtl() to return 2 seconds MetricsRW mockDatastaxMetricsRW = spy( datastaxMetricsRW ); doReturn( 2 ).when( mockDatastaxMetricsRW, "getTtl", anyObject(), anyObject(), anyObject() ); mockDatastaxMetricsRW.insertRollups( cxts ); // read it quickly. Points<BluefloodTimerRollup> points = datastaxMetricsRW.getDataToRollup(locator, expectedMetric.getRollupType(), getRangeFromMinAgoToNow(5), CassandraModel.getBasicColumnFamilyName(granularity)); assertEquals( "number of points read before TTL", 1, points.getPoints().size() ); // let it time out. Thread.sleep(2000); // ensure it is gone. points = datastaxMetricsRW.getDataToRollup(locator, expectedMetric.getRollupType(), getRangeFromMinAgoToNow(5), CassandraModel.getBasicColumnFamilyName(granularity)); assertEquals( "number of points read after TTL", 0, points.getPoints().size() ); } @Test public void testHigherGranReadWrite() throws Exception { // pick first locator from input metrics Locator locator = numericMap.keySet().iterator().next(); final IMetric expectedMetric = numericMap.get(locator); // pick a granularity Granularity granularity = Granularity.MIN_60; List<SingleRollupWriteContext> cxts = new ArrayList<SingleRollupWriteContext>(); cxts.add( createSingleRollupWriteContext( granularity, expectedMetric )); // insert metric datastaxMetricsRW.insertRollups( cxts ); // read the raw data. Points points = datastaxMetricsRW.getDataToRollup( expectedMetric.getLocator(), expectedMetric.getRollupType(), getRangeFromMinAgoToNow( 5 ), CassandraModel.getBasicColumnFamilyName( granularity ) ); assertEquals( "number of points read", 1, points.getPoints().size() ); // create the rollup final BasicRollup rollup = BasicRollup.buildRollupFromRollups( points ); // should be the same as simpletimerRollup Assert.assertEquals(timerRollup, rollup); // assemble it into points, but give it a new timestamp. points = new Points<BasicRollup>() {{ add(new Point(expectedMetric.getCollectionTime(), rollup)); }}; List<SingleRollupWriteContext> coaserCxts = toWriteContext(expectedMetric.getLocator(), points, granularity.coarser() ); datastaxMetricsRW.insertRollups( coaserCxts ); // we should be able to read that now. Points<BasicRollup> pointsCoarser = datastaxMetricsRW.getDataToRollup( expectedMetric.getLocator(), RollupType.BF_BASIC, getRangeFromMinAgoToNow( 5 ), CassandraModel.getBasicColumnFamilyName( granularity.coarser() ) ); assertEquals( "number of points read in coarser gran", 1, pointsCoarser.getPoints().size() ); BasicRollup rollupCoarser = pointsCoarser.getPoints().values().iterator().next().getData(); // rollups should be identical since one is just a coarse rollup of the other. assertEquals( "rollup read in coarser gran is the same", rollup, rollupCoarser ); } @Test public void testLocatorWritten() throws Exception { // insert metrics using datastax datastaxMetricsRW.insertMetrics(numericMap.values()); LocatorIO locatorIO = IOContainer.fromConfig().getLocatorIO(); for ( Locator locator : numericMap.keySet() ) { long shard = Util.getShard( locator.toString() ); Collection<Locator> locators = locatorIO.getLocators(shard); assertTrue(String.format("locator %s should exist", locator), locators.contains(locator)); } } }