package org.araqne.logstorage.file; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import org.araqne.logstorage.CallbackSet; import org.araqne.logstorage.Log; import org.araqne.logstorage.LogFlushCallback; import org.araqne.logstorage.LogFlushCallbackArgs; import org.araqne.logstorage.LogMarshaler; import org.araqne.logstorage.LogUtil; import org.araqne.storage.api.FilePath; import org.araqne.storage.localfile.LocalFilePath; import org.junit.Test; public class LogFlushCallbackTest { @Test public void testv2() throws InvalidLogFileHeaderException, IOException { final AtomicInteger fcnt = new AtomicInteger(0); final AtomicInteger cmplcnt = new AtomicInteger(0); CallbackSet cbSet = new CallbackSet(); cbSet.get(LogFlushCallback.class).add(new LogFlushCallback() { @Override public void onFlushException(LogFlushCallbackArgs arg, Throwable t) { } @Override public void onFlushCompleted(LogFlushCallbackArgs args) { cmplcnt.incrementAndGet(); } @Override public void onFlush(LogFlushCallbackArgs arg) { fcnt.incrementAndGet(); } }); FilePath indexPath = new LocalFilePath("lfctestv2.idx"); FilePath dataPath = new LocalFilePath("lfctestv2.dat"); indexPath.deleteOnExit(); dataPath.deleteOnExit(); LogFileWriterV2 writer = new LogFileWriterV2(indexPath, dataPath, cbSet, "test", LogUtil.getDay(new Date()), new AtomicLong(-1)); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 100; ++i) { sb.append("data"); } String line = sb.toString(); int testcnt = 15100; try { for (int i = 0; i < testcnt; ++i) { Map<String, Object> logdata = new HashMap<String, Object>(); logdata.put("line", line); writer.write(new Log("test", new Date(), i + 1, logdata)); } } finally { writer.close(); } System.out.println("flush count: " + fcnt.get()); System.out.println("completed flush count: " + cmplcnt.get()); assertTrue("fcnt.get() == 0", 0 != fcnt.get()); assertEquals(fcnt.get(), cmplcnt.get()); LogFileReaderV2 reader = null; try { reader = new LogFileReaderV2("test", indexPath, dataPath); LogRecordCursor cursor = reader.getCursor(); int logcnt = 0; while (cursor.hasNext()) { LogRecord next = cursor.next(); @SuppressWarnings("unused") Log converted = LogMarshaler.convert("test", next); logcnt++; } assertEquals(testcnt, logcnt); reader.close(); } finally { if (reader != null) reader.close(); } } }