/*
* Copyright 2010-2014 Ning, Inc.
* Copyright 2014 The Billing Project, LLC
*
* Ning licenses this file to you under the Apache License, version 2.0
* (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package org.killbill.billing.plugin.meter.timeline;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.killbill.billing.plugin.meter.MeterTestSuiteNoDB;
import org.killbill.billing.plugin.meter.timeline.codec.DefaultSampleCoder;
import org.killbill.billing.plugin.meter.timeline.codec.SampleCoder;
import org.killbill.billing.plugin.meter.timeline.samples.SampleOpcode;
import org.killbill.billing.plugin.meter.timeline.samples.ScalarSample;
import org.killbill.billing.plugin.meter.timeline.sources.SourceSamplesForTimestamp;
import org.killbill.billing.plugin.meter.timeline.times.DefaultTimelineCoder;
import org.killbill.billing.plugin.meter.timeline.times.TimelineCoder;
import org.testng.Assert;
import org.testng.annotations.Test;
public class TestTimelineSourceEventAccumulator extends MeterTestSuiteNoDB {
private static final int HOST_ID = 1;
private static final int EVENT_CATEGORY_ID = 123;
private static final MockTimelineDao dao = new MockTimelineDao();
private static final TimelineCoder timelineCoder = new DefaultTimelineCoder();
private static final SampleCoder sampleCoder = new DefaultSampleCoder();
@Test(groups = "fast")
public void testSimpleAggregate() throws IOException {
final DateTime startTime = new DateTime(DateTimeZone.UTC);
final TimelineSourceEventAccumulator accumulator = new TimelineSourceEventAccumulator(dao, timelineCoder, sampleCoder, HOST_ID,
EVENT_CATEGORY_ID, startTime);
// Send a first type of data
final int sampleCount = 5;
final int sampleKindId = 1;
sendData(accumulator, startTime, sampleCount, sampleKindId);
Assert.assertEquals(accumulator.getStartTime(), startTime);
Assert.assertEquals(accumulator.getEndTime(), startTime.plusSeconds(sampleCount - 1));
Assert.assertEquals(accumulator.getSourceId(), HOST_ID);
Assert.assertEquals(accumulator.getTimelines().size(), 1);
Assert.assertEquals(accumulator.getTimelines().get(sampleKindId).getSampleCount(), sampleCount);
Assert.assertEquals(accumulator.getTimelines().get(sampleKindId).getMetricId(), sampleKindId);
// Send now a second type
final DateTime secondStartTime = startTime.plusSeconds(sampleCount + 1);
final int secondSampleCount = 15;
final int secondSampleKindId = 2;
sendData(accumulator, secondStartTime, secondSampleCount, secondSampleKindId);
// We keep the start time of the accumulator
Assert.assertEquals(accumulator.getStartTime(), startTime);
Assert.assertEquals(accumulator.getEndTime(), secondStartTime.plusSeconds(secondSampleCount - 1));
Assert.assertEquals(accumulator.getSourceId(), HOST_ID);
Assert.assertEquals(accumulator.getTimelines().size(), 2);
// We advance all timelines in parallel
Assert.assertEquals(accumulator.getTimelines().get(sampleKindId).getSampleCount(), sampleCount + secondSampleCount);
Assert.assertEquals(accumulator.getTimelines().get(sampleKindId).getMetricId(), sampleKindId);
Assert.assertEquals(accumulator.getTimelines().get(secondSampleKindId).getSampleCount(), sampleCount + secondSampleCount);
Assert.assertEquals(accumulator.getTimelines().get(secondSampleKindId).getMetricId(), secondSampleKindId);
}
private void sendData(final TimelineSourceEventAccumulator accumulator, final DateTime startTime, final int sampleCount, final int sampleKindId) {
final Map<Integer, ScalarSample> samples = new HashMap<Integer, ScalarSample>();
for (int i = 0; i < sampleCount; i++) {
samples.put(sampleKindId, new ScalarSample<Long>(SampleOpcode.LONG, i + 1242L));
final SourceSamplesForTimestamp hostSamplesForTimestamp = new SourceSamplesForTimestamp(HOST_ID, "JVM", startTime.plusSeconds(i), samples);
accumulator.addSourceSamples(hostSamplesForTimestamp);
}
}
}