/* * Copyright (c) 2010-2012 Grid Dynamics Consulting Services, Inc, All Rights Reserved * http://www.griddynamics.com * * This library is free software; you can redistribute it and/or modify it under the terms of * the Apache License; either * version 2.0 of the License, or any later version. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package com.griddynamics.jagger.storage.fs.timelog; import org.testng.annotations.*; import static org.testng.AssertJUnit.*; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.util.*; public class TimeLogTest { @Test(enabled = false) public void testSingleStreamAggregation() { NumericalTimeLogReader reader = new NumericalTimeLogReader(Collections.singletonList(getDataInputStream1())); Iterator<Window<NumericalTimeLogReader.StatisticalAggregator>> cursor = reader.aggregateStatistics(100, 3); Window<NumericalTimeLogReader.StatisticalAggregator> window = cursor.next(); assertTrue(testWindow(window, new double[] {2, 20, 200}, new double[] {2, 20, 200}, new double[] {2, 20, 200}, new long[] {4, 4, 4})); window = cursor.next(); assertTrue(testWindow(window, new double[] {3, 30, 300}, new double[] {2, 20, 200}, new double[] {4, 40, 400}, new long[] {2, 2, 2})); window = cursor.next(); assertTrue(testWindow(window, new double[] {2, 20, 200}, new double[] {2, 20, 200}, new double[] {2, 20, 200}, new long[] {1, 1, 1})); window = cursor.next(); assertTrue(testWindow(window, new double[] {1, 10, 100}, new double[] {1, 10, 100}, new double[] {1, 10, 100}, new long[] {1, 1, 1})); window = cursor.next(); assertTrue(window.isEmpty()); window = cursor.next(); assertTrue(window.isEmpty()); window = cursor.next(); assertTrue(window.isEmpty()); window = cursor.next(); assertTrue(testWindow(window, new double[] {2, 20, 200}, new double[] {2, 20, 200}, new double[] {2, 20, 200}, new long[] {1, 1, 1})); } @Test(enabled = false) public void testMultipleStreamAggregation() { NumericalTimeLogReader reader = new NumericalTimeLogReader(Arrays.asList(getDataInputStream1(), getDataInputStream2())); Iterator<Window<NumericalTimeLogReader.StatisticalAggregator>> cursor = reader.aggregateStatistics(100, 3); Window<NumericalTimeLogReader.StatisticalAggregator> window = cursor.next(); assertTrue(testWindow(window, new double[] {3, 30, 300}, new double[] {2, 20, 200}, new double[] {4, 40, 400}, new long[] {8, 8, 8})); window = cursor.next(); assertTrue(testWindow(window, new double[] {3, 30, 300}, new double[] {2, 20, 200}, new double[] {4, 40, 400}, new long[] {2, 2, 2})); window = cursor.next(); assertTrue(testWindow(window, new double[] {3, 30, 300}, new double[] {2, 20, 200}, new double[] {4, 40, 400}, new long[] {2, 2, 2})); } private static boolean testWindow(Window<NumericalTimeLogReader.StatisticalAggregator> window, double[] averages, double[] minimums, double[] maximums, long[] samples) { int i = 0; for(NumericalTimeLogReader.StatisticalAggregator aggregator : window.getAggregators()) { if( Double.compare(aggregator.getMean(), averages[i]) != 0 || Double.compare(aggregator.getMax(), maximums[i]) != 0 || Double.compare(aggregator.getMin(), minimums[i]) != 0 || aggregator.getNumberOfSamples() != samples[i]) { return false; } i++; } return true; } private static DataInputStream getDataInputStream1() { ByteArrayOutputStream boStream = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(boStream); NumericalTimeLogWriter writer = new NumericalTimeLogWriter(dos); writer.startFlushing(); writer.write(100, new double[]{2, 20, 200}); writer.write(100, new double[]{2, 20, 200}); writer.write(120, new double[]{2, 20, 200}); writer.write(199, new double[]{2, 20, 200}); writer.write(201, new double[]{2, 20, 200}); writer.write(250, new double[]{4, 40, 400}); writer.write(300, new double[]{2, 20, 200}); writer.write(400, new double[]{1, 10, 100}); writer.write(830, new double[]{2, 20, 200}); writer.close(); ByteArrayInputStream biStream = new ByteArrayInputStream(boStream.toByteArray()); return new DataInputStream(biStream); } private static DataInputStream getDataInputStream2() { ByteArrayOutputStream boStream = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(boStream); NumericalTimeLogWriter writer = new NumericalTimeLogWriter(dos); writer.startFlushing(); writer.write(100, new double[]{4, 40, 400}); writer.write(150, new double[]{4, 40, 400}); writer.write(151, new double[]{4, 40, 400}); writer.write(167, new double[]{4, 40, 400}); writer.write(303, new double[]{4, 40, 400}); writer.close(); ByteArrayInputStream biStream = new ByteArrayInputStream(boStream.toByteArray()); return new DataInputStream(biStream); } }