package com.opengamma.bbg.referencedata.statistics; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.testng.annotations.Test; import com.google.common.base.Supplier; import com.google.common.collect.Sets; import com.opengamma.util.test.TestGroup; import com.opengamma.util.tuple.Pair; import com.opengamma.util.tuple.Pairs; /** * Test. */ public class BloombergReferenceDataStatisticsTest { @Test(groups = TestGroup.UNIT) public void singleTest() { MapBloombergReferenceDataStatistics stats = new MapBloombergReferenceDataStatistics(); stats.recordStatistics(Collections.singleton("1"), Collections.singleton("A")); assertEquals(1, stats.getTotalGetsCount()); Snapshot snap1 = stats.getSnapshot(); assertEquals(1, snap1.getLookupsByField().size()); assertEquals(1, snap1.getLookupsBySecurity().size()); assertEquals(1, snap1.getTotalLookups()); assertEquals(1, snap1.getLookupsByField().get(0).getFirst().longValue()); assertEquals(1, snap1.getLookupsBySecurity().get(0).getFirst().longValue()); stats.recordStatistics(Collections.singleton("1"), Collections.singleton("A")); assertEquals(2, stats.getTotalGetsCount()); Snapshot snap2 = stats.getSnapshot(); assertEquals(1, snap2.getLookupsByField().size()); assertEquals(1, snap2.getLookupsBySecurity().size()); assertEquals(2, snap2.getTotalLookups()); assertEquals(2, snap2.getLookupsByField().get(0).getFirst().longValue()); assertEquals(2, snap2.getLookupsBySecurity().get(0).getFirst().longValue()); } @Test(groups = TestGroup.UNIT) public void multiTest() { MapBloombergReferenceDataStatistics stats = new MapBloombergReferenceDataStatistics(); stats.recordStatistics(Collections.singleton("1"), Collections.singleton("A")); assertEquals(1, stats.getTotalGetsCount()); Snapshot snap1 = stats.getSnapshot(); assertEquals(1, snap1.getLookupsByField().size()); assertEquals(1, snap1.getLookupsBySecurity().size()); assertEquals(1, snap1.getTotalLookups()); assertEquals(1, snap1.getLookupsByField().get(0).getFirst().longValue()); assertEquals(1, snap1.getLookupsBySecurity().get(0).getFirst().longValue()); stats.recordStatistics(Sets.newHashSet("1", "2"), Collections.singleton("B")); assertEquals(3, stats.getTotalGetsCount()); Snapshot snap2 = stats.getSnapshot(); assertEquals(2, snap2.getLookupsByField().size()); assertEquals(2, snap2.getLookupsBySecurity().size()); assertEquals(3, snap2.getTotalLookups()); assertEquals(2, snap2.getLookupsByField().size()); assertEquals(2, snap2.getLookupsBySecurity().size()); assertPairEquals(Pairs.of(2, "1"), snap2.getLookupsBySecurity().get(0)); assertPairEquals(Pairs.of(1, "2"), snap2.getLookupsBySecurity().get(1)); assertPairEquals(Pairs.of(2, "B"), snap2.getLookupsByField().get(0)); assertPairEquals(Pairs.of(1, "A"), snap2.getLookupsByField().get(1)); } @Test(groups = TestGroup.UNIT_SLOW) public void bigTest() throws InterruptedException { assertSmall(new Supplier<MapBloombergReferenceDataStatistics>() { @Override public MapBloombergReferenceDataStatistics get() { return getBigStats(); } }, 10 * 1024 * 1024, "Stats"); } @Test(groups = TestGroup.INTEGRATION) // mark as integration because its a bit random public void bigIncrementTest() throws InterruptedException { final MapBloombergReferenceDataStatistics stats = getBigStats(); assertSmall(new Supplier<Object>() { @Override public Object get() { incrementBigStats(stats); return null; } }, 1 * 1024 * 1024, "Increment"); } @Test(groups = TestGroup.INTEGRATION) // mark as integration because its a bit random public void bigSnapshotTest() throws InterruptedException { final MapBloombergReferenceDataStatistics stats = getBigStats(); assertSmall(new Supplier<Snapshot>() { @Override public Snapshot get() { return stats.getSnapshot(); } }, 10 * 1024 * 1024, "Snapshot"); } @Test(enabled = false) public void fastTest() throws InterruptedException { MapBloombergReferenceDataStatistics stats = getBigStats(); for (int i = 0; i < 10; i++) { long start = System.currentTimeMillis(); int repeats = 20; for (int n = 0; n < repeats; n++) { stats.getSnapshot(); } long elapsed = System.currentTimeMillis() - start; assertTrue(elapsed < repeats * 1000); } } private <T> void assertSmall(Supplier<T> factory, long maxSize, String name) throws InterruptedException { assertSmallAndFast(factory, maxSize, null, name); } private <T> void assertSmallAndFast(Supplier<T> factory, Long maxSize, Long maxTime, String name) throws InterruptedException { int blocks = 3; int blockSize = 10; List<T> list = new ArrayList<T>(blocks * blockSize); long baseline = getUsedMemory(); for (int i = 0; i < blocks; i++) { long start = System.currentTimeMillis(); for (int n=0;n<blockSize;n++) { list.add(factory.get()); } long elapsed = System.currentTimeMillis() - start; long used = getUsedMemory() - baseline; long usedPerUnit = used / ((i + 1) * blockSize); long elapsedPerUnit = elapsed / blockSize; System.out.println("Used ~" + usedPerUnit + "bytes and " + elapsedPerUnit + "ms per "+name); if (maxSize != null) { assertLessThan((long) maxSize, usedPerUnit); } if (maxTime != null) { assertLessThan((long) maxTime, elapsedPerUnit); } } } private void assertLessThan(long expected, long actual) { if (actual > expected) { throw new AssertionError(actual+" > "+expected); } } private long getUsedMemory() { System.gc(); System.gc(); return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); } private MapBloombergReferenceDataStatistics getBigStats() { MapBloombergReferenceDataStatistics stats = new MapBloombergReferenceDataStatistics(); return incrementBigStats(stats); } private static final Set<String> securities = getInts(100000); private static final Set<String> fields = getInts(100); private MapBloombergReferenceDataStatistics incrementBigStats(MapBloombergReferenceDataStatistics stats) { stats.recordStatistics(securities, fields); return stats; } private static Set<String> getInts(int count) { HashSet<String> ret = new HashSet<String>(count); for (int n = 0; n < count; n++) { ret.add(Integer.toString(n)); } return ret; } private <TValue> void assertPairEquals(Pair<? extends Number, TValue> expected, Pair<? extends Number, TValue> actual) { assertEquals(expected.getFirst().longValue(), actual.getFirst().longValue()); assertEquals(expected.getSecond(), actual.getSecond()); } }