/*
* 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.ThriftEnvelopeEvent;
import com.ning.metrics.serialization.thrift.ThriftEnvelope;
import com.ning.metrics.serialization.thrift.ThriftField;
import com.ning.metrics.serialization.writer.CallbackHandler;
import com.ning.metrics.serialization.writer.DiskSpoolEventWriter;
import com.ning.metrics.serialization.writer.ObjectOutputEventSerializer;
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.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicInteger;
public class TestScribeDiskSpoolEventWriterProvider
{
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 testThriftEnvelopeEvent() throws Exception
{
System.setProperty("eventtracker.event-type", "THRIFT");
config = new ConfigurationObjectFactory(System.getProperties()).build(EventTrackerConfig.class);
// Create a Thrift event
final List<ThriftField> thriftFieldList = new ArrayList<ThriftField>();
thriftFieldList.add(ThriftField.createThriftField("hello", (short) 1));
thriftFieldList.add(ThriftField.createThriftField("world", (short) 12));
final ThriftEnvelope envelope = new ThriftEnvelope(EVENT_NAME, thriftFieldList);
final ThriftEnvelopeEvent event = new ThriftEnvelopeEvent(EVENT_DATE_TIME, envelope);
final int numberOfThriftEventsToSend = 3;
// Create the DiskSpoolEventWriter
final AtomicInteger sendCalls = new AtomicInteger(0);
final DiskSpoolEventWriter diskSpoolEventWriter = diskWriterProvider(new EventSender()
{
@Override
public void send(final File file, final CallbackHandler handler)
{
sendCalls.incrementAndGet();
}
@Override
public void close()
{
}
});
// Flush 3 events
for (int i = 0; i < numberOfThriftEventsToSend; i++) {
diskSpoolEventWriter.write(event);
}
diskSpoolEventWriter.commit();
diskSpoolEventWriter.flush();
Assert.assertEquals(sendCalls.get(), 1);
// Flush another series
for (int i = 0; i < numberOfThriftEventsToSend; 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(EventSender sender) throws IOException
{
return new DiskSpoolEventWriterProvider(
config,
sender,
new ScheduledThreadPoolExecutor(1, Executors.defaultThreadFactory()),
new ObjectOutputEventSerializer()
).get();
}
}