package com.rackspacecloud.blueflood.rollup; import org.junit.Assert; import org.junit.Test; import static org.junit.Assert.assertEquals; public class SlotKeyTest { @Test public void test_parse() { SlotKey parsed = SlotKey.parse("metrics_1440m,10,20"); assertEquals(parsed.getGranularity(), Granularity.MIN_1440); assertEquals(parsed.getSlot(), 10); assertEquals(parsed.getShard(), 20); // invalid results Assert.assertNull(SlotKey.parse("metrics_6m,10,20")); Assert.assertNull(SlotKey.parse("metrics_1440m,200,20")); Assert.assertNull(SlotKey.parse("metrics_1440m,10,128")); } @Test public void test_getChildrenKeys() { // the relationship between slots plays out here. int shard = 0; int slot = 0; // full res slots have no children. int expect = 0; assertEquals(expect, SlotKey.of(Granularity.FULL, slot, shard).getChildrenKeys().size()); // min5 slots contain only their full res counterpart. expect = expect * 1 + 1; assertEquals(expect, SlotKey.of(Granularity.MIN_5, slot, shard).getChildrenKeys().size()); // min20 slots contain their 4 min5 children and full res grandchildren. expect = expect * 4 + 4; assertEquals(expect, SlotKey.of(Granularity.MIN_20, slot, shard).getChildrenKeys().size()); // and so on. the relationship between min60 and min20 is a factor of 3. expect = expect * 3 + 3; assertEquals(expect, SlotKey.of(Granularity.MIN_60, slot, shard).getChildrenKeys().size()); // min240 and min60 is a factor of 4. expect = expect * 4 + 4; assertEquals(expect, SlotKey.of(Granularity.MIN_240, slot, shard).getChildrenKeys().size()); // min1440 and min240 is a factor of 6. expect = expect * 6 + 6; assertEquals(expect, SlotKey.of(Granularity.MIN_1440, slot, shard).getChildrenKeys().size()); } @Test public void test_getChildrenKeys_with_destinationGranularity() { // the relationship between slots plays out here. int shard = 0; int slot = 0; // min5 slots contain only their full res counterpart. assertEquals("Incorrect number of children - scenario 0", 1, SlotKey.of(Granularity.MIN_5, slot, shard).getChildrenKeys(Granularity.FULL).size()); //1 level assertEquals("Incorrect number of children - scenario 1", 4, SlotKey.of(Granularity.MIN_20, slot, shard).getChildrenKeys(Granularity.MIN_5).size()); //2 levels assertEquals("Incorrect number of children - scenario 2", 3 * 4, SlotKey.of(Granularity.MIN_60, slot, shard).getChildrenKeys(Granularity.MIN_5).size()); //4 levels assertEquals("Incorrect number of children - scenario 3", 6 * 4 * 3 * 4, SlotKey.of(Granularity.MIN_1440, slot, shard).getChildrenKeys(Granularity.MIN_5).size()); } @Test(expected = IllegalArgumentException.class) public void testGetChildrenKeysWithSameDestGranularity() { SlotKey.of(Granularity.MIN_20, 1, 1).getChildrenKeys(Granularity.MIN_20); } @Test(expected = IllegalArgumentException.class) public void testGetChildrenKeysWithInvalidDestGranularity() { SlotKey.of(Granularity.MIN_20, 1, 1).getChildrenKeys(Granularity.MIN_60); } @Test public void testExtrapolate() { int shard = 1; //full -> 5m assertEquals("Invalid extrapolation - scenario 0", SlotKey.of(Granularity.MIN_5, 1, shard), SlotKey.of(Granularity.FULL, 1, shard).extrapolate(Granularity.MIN_5)); assertEquals("Invalid extrapolation - scenario 1", SlotKey.of(Granularity.MIN_5, 43, shard), SlotKey.of(Granularity.FULL, 43, shard).extrapolate(Granularity.MIN_5)); //5m -> 5m assertEquals("Invalid extrapolation - scenario 2", SlotKey.of(Granularity.MIN_5, 24, shard), SlotKey.of(Granularity.MIN_5, 24, shard).extrapolate(Granularity.MIN_5)); //5m -> 20m assertEquals("Invalid extrapolation - scenario 3", SlotKey.of(Granularity.MIN_20, 0, shard), SlotKey.of(Granularity.MIN_5, 0, shard).extrapolate(Granularity.MIN_20)); assertEquals("Invalid extrapolation - scenario 4", SlotKey.of(Granularity.MIN_20, 0, shard), SlotKey.of(Granularity.MIN_5, 3, shard).extrapolate(Granularity.MIN_20)); assertEquals("Invalid extrapolation - scenario 5", SlotKey.of(Granularity.MIN_20, 1, shard), SlotKey.of(Granularity.MIN_5, 4, shard).extrapolate(Granularity.MIN_20)); assertEquals("Invalid extrapolation - scenario 6", SlotKey.of(Granularity.MIN_20, 4032 / 4 - 1, shard), SlotKey.of(Granularity.MIN_5, 4031, shard).extrapolate(Granularity.MIN_20)); //5m -> 60m assertEquals("Invalid extrapolation - scenario 7", SlotKey.of(Granularity.MIN_60, 0, shard), SlotKey.of(Granularity.MIN_5, 3, shard).extrapolate(Granularity.MIN_60)); assertEquals("Invalid extrapolation - scenario 8", SlotKey.of(Granularity.MIN_60, 0, shard), SlotKey.of(Granularity.MIN_5, 3, shard).extrapolate(Granularity.MIN_60)); assertEquals("Invalid extrapolation - scenario 9", SlotKey.of(Granularity.MIN_60, 1, shard), SlotKey.of(Granularity.MIN_5, 12, shard).extrapolate(Granularity.MIN_60)); assertEquals("Invalid extrapolation - scenario 10", SlotKey.of(Granularity.MIN_60, 4032 / 12 - 1, shard), SlotKey.of(Granularity.MIN_5, 4031, shard).extrapolate(Granularity.MIN_60)); //5m -> 1440m assertEquals("Invalid extrapolation - scenario 11", SlotKey.of(Granularity.MIN_1440, 0, shard), SlotKey.of(Granularity.MIN_5, 3, shard).extrapolate(Granularity.MIN_1440)); assertEquals("Invalid extrapolation - scenario 12", SlotKey.of(Granularity.MIN_1440, 0, shard), SlotKey.of(Granularity.MIN_5, 287, shard).extrapolate(Granularity.MIN_1440)); assertEquals("Invalid extrapolation - scenario 13", SlotKey.of(Granularity.MIN_1440, 1, shard), SlotKey.of(Granularity.MIN_5, 288, shard).extrapolate(Granularity.MIN_1440)); //20m -> 60m assertEquals("Invalid extrapolation - scenario 14", SlotKey.of(Granularity.MIN_60, 0, shard), SlotKey.of(Granularity.MIN_20, 1, shard).extrapolate(Granularity.MIN_60)); assertEquals("Invalid extrapolation - scenario 15", SlotKey.of(Granularity.MIN_60, 0, shard), SlotKey.of(Granularity.MIN_20, 2, shard).extrapolate(Granularity.MIN_60)); assertEquals("Invalid extrapolation - scenario 16", SlotKey.of(Granularity.MIN_60, 1, shard), SlotKey.of(Granularity.MIN_20, 3, shard).extrapolate(Granularity.MIN_60)); } @Test(expected = IllegalArgumentException.class) public void testExtrapolateWithLowerDestGranularity1() { SlotKey.of(Granularity.MIN_20, 1, 1).extrapolate(Granularity.MIN_5); } @Test(expected = IllegalArgumentException.class) public void testExtrapolateWithLowerDestGranularity2() { SlotKey.of(Granularity.MIN_1440, 1, 1).extrapolate(Granularity.MIN_5); } @Test(expected = IllegalArgumentException.class) public void testExtrapolateWithLowerDestGranularity3() { SlotKey.of(Granularity.MIN_60, 1, 1).extrapolate(Granularity.MIN_20); } }