package org.cloudname.timber.server.handler.archiver; import com.google.protobuf.ByteString; import junit.framework.Assert; import org.cloudname.idgen.IdGenerator; import org.cloudname.log.archiver.WriteReport; import org.cloudname.log.pb.Timber; import org.joda.time.DateTime; import org.junit.*; import org.junit.rules.TemporaryFolder; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.*; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; /** * Test the MetadataHandler. * @author acidmoose */ public class MetadataHandlerTest { @Rule public TemporaryFolder temp = new TemporaryFolder(); private IdGenerator idGenerator; @Before public void setup() { idGenerator = new IdGenerator(1L); } /** * Check the method for writing acks. * @throws IOException */ @Test public void testWriteAck() throws IOException { final MetadataHandler handler = MetadataHandler.getInstance(); final File file = temp.newFile("ackfile"); handler.writeAck(file, "id"); Assert.assertTrue(file.exists()); final BufferedReader reader = new BufferedReader( new FileReader(file.getAbsolutePath() + MetadataHandler.METADATA_FILE_SUFFIX)); String line = reader.readLine(); Assert.assertEquals("File content is not correct.", "id", line); reader.close(); } @Test @Ignore public void benchmarkBestCase() throws IOException { final File slotFile = temp.newFile(); final MetadataHandler handler = MetadataHandler.getInstance(); final int numEntries = 100000; final List<Timber.LogEvent> events = new ArrayList<Timber.LogEvent>(); for (int i = 0; i < numEntries; i++) { events.add(i, generateEvent(idGenerator, i)); } final List<WriteReport> writeReports = new ArrayList<WriteReport>(); for (int i = 0; i < numEntries; i++) { writeReports.add(i, new WriteReport(slotFile, 0L, 0L, i)); } final long start = System.currentTimeMillis(); for (int i = 0; i < numEntries; i++) { handler.writeAck(writeReports.get(i).getSlotFile(), events.get(i).getId()); } handler.flush(); final long end = System.currentTimeMillis(); System.out.println(numEntries + " entries written in " + (end-start) + " ms."); } @Test @Ignore public void benchmarkWorstCase() throws IOException { final File slotFile = temp.newFile(); final File slotFile2 = temp.newFile(); final MetadataHandler handler = MetadataHandler.getInstance(); final int numEntries = 100000; final List<Timber.LogEvent> events = new ArrayList<Timber.LogEvent>(); for (int i = 0; i < numEntries; i++) { events.add(i, generateEvent(idGenerator, i)); } final List<WriteReport> writeReports = new ArrayList<WriteReport>(); for (int i = 0; i < numEntries; i++) { writeReports.add(i, new WriteReport(((i % 2) == 0) ? slotFile : slotFile2, 0L, 0L, i)); } final long start = System.currentTimeMillis(); for (int i = 0; i < numEntries; i++) { handler.writeAck(writeReports.get(i).getSlotFile(), events.get(i).getId()); } handler.flush(); final long end = System.currentTimeMillis(); System.out.println(numEntries + " entries written in " + (end-start) + " ms."); } private Timber.LogEvent generateEvent(final IdGenerator idGenerator, final long timestamp) { final Timber.LogEvent.Builder builder = Timber.LogEvent.newBuilder(); builder .setTimestamp(timestamp) .setConsistencyLevel(Timber.ConsistencyLevel.SYNC) .setLevel(800) .setHost("host") .setServiceName("servicename") .setSource(MetadataHandlerTest.class.getName()) .setPid(0) .setTid((int) Thread.currentThread().getId()) .setType("T") .addPayload( Timber.Payload.newBuilder() .setName("msg") .setPayload(ByteString.copyFromUtf8("some payload"))); if (idGenerator != null) { builder.setId(Long.toString(idGenerator.getNextId())); } return builder.build(); } }