/*
* Copyright 2010-2011 Ning, Inc.
*
* 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 com.ning.metrics.eventtracker;
import com.ning.metrics.serialization.event.Event;
import com.ning.metrics.serialization.event.SmileEnvelopeEvent;
import com.ning.metrics.serialization.smile.SmileEnvelopeEventDeserializer;
import com.ning.metrics.serialization.smile.SmileEnvelopeEventSerializer;
import com.ning.metrics.serialization.writer.CallbackHandler;
import com.ning.metrics.serialization.writer.DiskSpoolEventWriter;
import org.joda.time.DateTime;
import org.skife.config.ConfigurationObjectFactory;
import org.testng.Assert;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicInteger;
public class TestSmileDiskSpoolEventWriterProvider
{
private static final File tmpDir = new File(System.getProperty("java.io.tmpdir"), "collector-" + System.currentTimeMillis());
private static final String EVENT_NAME = "myEnvelope";
private static final DateTime EVENT_DATE_TIME = new DateTime();
private EventTrackerConfig config;
@BeforeTest(alwaysRun = true)
public void setUp() throws Exception
{
System.setProperty("eventtracker.diskspool.path", tmpDir.getAbsolutePath());
config = new ConfigurationObjectFactory(System.getProperties()).build(EventTrackerConfig.class);
}
@AfterTest
public void tearDown() throws Exception
{
tmpDir.delete();
}
@Test(groups = "fast")
public void testMultipleSmileEnvelopeEvents() throws Exception
{
System.setProperty("eventtracker.event-type", "SMILE");
config = new ConfigurationObjectFactory(System.getProperties()).build(EventTrackerConfig.class);
// Create a SmileEnvelope event
final HashMap<String, Object> map = new HashMap<String, Object>();
map.put("first", "hello");
map.put("second", "world");
final Event event = new SmileEnvelopeEvent(EVENT_NAME, EVENT_DATE_TIME, map);
final int numberOfSmileEventsToSend = 3;
// Send 3 events, the writer library should bufferize them
final AtomicInteger sendCalls = new AtomicInteger(0);
final DiskSpoolEventWriter diskSpoolEventWriter = diskWriterProvider(new EventSender()
{
@Override
public void send(final File file, final CallbackHandler handler)
{
Assert.assertTrue(file.exists());
sendCalls.incrementAndGet();
// extract the events to check that files are formatted correctly
try {
final SmileEnvelopeEventDeserializer extractor = new SmileEnvelopeEventDeserializer(new FileInputStream(file), false);
int numEventsExtracted = 0;
SmileEnvelopeEvent event = extractor.getNextEvent();
while (event != null) {
numEventsExtracted++;
event = extractor.getNextEvent();
}
Assert.assertEquals(numEventsExtracted, numberOfSmileEventsToSend);
}
catch (Exception e) {
Assert.fail("malformed output file");
}
}
@Override
public void close()
{
}
});
// Flush 3 events, but we should get only one send call (buffering)
for (int i = 0; i < numberOfSmileEventsToSend; i++) {
diskSpoolEventWriter.write(event);
}
diskSpoolEventWriter.commit();
diskSpoolEventWriter.flush();
Assert.assertEquals(sendCalls.get(), 1);
// Flush another series
for (int i = 0; i < numberOfSmileEventsToSend; i++) {
diskSpoolEventWriter.write(event);
}
diskSpoolEventWriter.commit();
diskSpoolEventWriter.flush();
Assert.assertEquals(sendCalls.get(), 2);
}
/**
* Create a DiskSpoolEventWriter with the specified EventSender
*
* @param sender EventSender to use
* @return DiskSpoolEventWriter create via the DiskSpoolEventWriterProvider
* @throws java.io.IOException generic serialization exception
*/
private DiskSpoolEventWriter diskWriterProvider(final EventSender sender) throws IOException
{
return new DiskSpoolEventWriterProvider(
config,
sender,
new ScheduledThreadPoolExecutor(1, Executors.defaultThreadFactory()),
new SmileEnvelopeEventSerializer(false)
).get();
}
}