private void assertNext(ExcerptTailer tailer, String expected) { String next = tailer.readText(); assertEquals(expected, next); } }
@Override public void run() { ExcerptTailer tailer = queue.createTailer(); progressLatch.countDown(); int lastDocId = -1; while (!Thread.currentThread().isInterrupted()) { String readText = tailer.readText(); if (readText != null) { System.out.println("Read a document " + readText); documentsRead++; int docId = Integer.parseInt(readText); assertTrue(docId == lastDocId + 1); lastDocId = docId; } } }
assertEquals("test 0", atailer.readText()); assertEquals("test 1", atailer.readText()); assertEquals("test 2", atailer.readText()); assertEquals("test 0", btailer.readText()); assertEquals("test 3", atailer.readText()); assertEquals("test 4", atailer.readText()); assertEquals("test 5", atailer.readText()); assertEquals("test 1", btailer.readText()); assertEquals("test 6", atailer.readText()); assertEquals(null, atailer.readText()); assertEquals("test 2", btailer.readText()); assertEquals(null, atailer.readText()); assertEquals("test 3", btailer.readText());
tailer.readText(tmpReadback); Assert.assertEquals("write/readText", problematic[p], tmpReadback.toString());
@Test public void createAQueue() { final String basePath = OS.TARGET + "/" + getClass().getSimpleName() + "-" + System.nanoTime(); try (ChronicleQueue queue = SingleChronicleQueueBuilder.single(basePath) .testBlockSize() .rollCycle(RollCycles.TEST_DAILY) .build()) { // Obtain an ExcerptAppender ExcerptAppender appender = queue.acquireAppender(); // write - {msg: TestMessage} appender.writeDocument(w -> w.write(() -> "msg").text("TestMessage")); // System.out.println(queue.dump()); // write - TestMessage appender.writeText("TestMessage"); ExcerptTailer tailer = queue.createTailer(); tailer.readDocument(w -> System.out.println("msg: " + w.read(() -> "msg").text())); assertEquals("TestMessage", tailer.readText()); } }
@Test public void testWriteText() { File dir = DirectoryUtils.tempDir("testWriteText"); try (ChronicleQueue queue = binary(dir) .testBlockSize() .build()) { ExcerptAppender appender = queue.acquireAppender(); ExcerptTailer tailer = queue.createTailer(); ExcerptTailer tailer2 = queue.createTailer(); int runs = 1000; for (int i = 0; i < runs; i++) appender.writeText("" + i); for (int i = 0; i < runs; i++) assertEquals("" + i, tailer.readText()); StringBuilder sb = new StringBuilder(); for (int i = 0; i < runs; i++) { assertTrue(tailer2.readText(sb)); assertEquals("" + i, sb.toString()); } } finally { try { IOTools.deleteDirWithFiles(dir, 2); } catch (IORuntimeException e) { // ignored } } }
@Test public void testTextReadWrite() { File tmpDir = getTmpDir(); try (final ChronicleQueue queue = builder(tmpDir, wireType) .build()) { queue.acquireAppender().writeText("hello world"); Assert.assertEquals("hello world", queue.createTailer().readText()); } }
@Test public void shouldNotGenerateGarbageReadingDocumentAfterEndOfFile() { final AtomicLong clock = new AtomicLong(System.currentTimeMillis()); File dir = getTmpDir(); try (ChronicleQueue q = builder(dir, wireType) .rollCycle(TEST_SECONDLY) .timeProvider(clock::get) .build()) { q.acquireAppender() .writeText("first"); } clock.addAndGet(1100); // this will write an EOF try (ChronicleQueue q = builder(dir, wireType) .rollCycle(TEST_SECONDLY) .timeProvider(clock::get) .build()) { ExcerptTailer tailer = q.createTailer(); Assert.assertEquals("first", tailer.readText()); GcControls.waitForGcCycle(); final long startCollectionCount = GcControls.getGcCount(); // allow a few GCs due to possible side-effect or re-used JVM final long maxAllowedGcCycles = 6; final long endCollectionCount = GcControls.getGcCount(); final long actualGcCycles = endCollectionCount - startCollectionCount; assertTrue(String.format("Too many GC cycles. Expected <= %d, but was %d", maxAllowedGcCycles, actualGcCycles), actualGcCycles <= maxAllowedGcCycles); } }
Assert.assertEquals("first", tailer.readText()); Assert.assertEquals(null, tailer.readText()); q.acquireAppender().writeText("even more text"); Assert.assertEquals("more text", excerptTailerBeforeAppend.readText()); Assert.assertEquals("even more text", excerptTailerAfterAppend.readText()); Assert.assertEquals("even more text", excerptTailerBeforeAppend.readText());
@Test public void testReadingWritingWhenCycleIsSkippedBackwards() throws Exception { final File dir = DirectoryUtils.tempDir(testName.getMethodName()); final RollCycles rollCycle = RollCycles.TEST_SECONDLY; // write first message try (ChronicleQueue queue = binary(dir) .rollCycle(rollCycle).build()) { queue.acquireAppender().writeText("first message"); } //TODO: this test fails when converted to use a TimeProvider. Need to work out why Thread.sleep(2100); // write second message try (ChronicleQueue queue = binary(dir) .rollCycle(rollCycle).build()) { queue.acquireAppender().writeText("second message"); } // read both messages try (ChronicleQueue queue = binary(dir) .rollCycle(rollCycle).build()) { ExcerptTailer tailer = queue.createTailer(); ExcerptTailer excerptTailer = tailer.direction(TailerDirection.BACKWARD).toEnd(); Assert.assertEquals("second message", excerptTailer.readText()); Assert.assertEquals("first message", excerptTailer.readText()); } }
q.acquireAppender() .writeText(EXPECTED); Assert.assertEquals(EXPECTED, excerptTailer.readText());
@Test public void testReadFromReadOnlyChronicle() { try (ChronicleQueue out = SingleChronicleQueueBuilder .binary(chroniclePath) .testBlockSize() .readOnly(!OS.isWindows()) .build()) { // check dump assertTrue(out.dump().length() > 1); // and tailer ExcerptTailer tailer = out.createTailer(); assertEquals(STR1, tailer.readText()); try (DocumentContext dc = tailer.readingDocument()) { assertEquals(STR2, dc.wire().bytes().readUtf8()); // even though this is read-only we can still call dc.wire().bytes().write... which causes java.lang.InternalError // Fixing this in a type-safe manner would require on Read/WriteDocumentContext to return WireIn/WireOut } } }
@Test public void testReadingWritingWhenCycleIsSkipped() { SetTimeProvider timeProvider = new SetTimeProvider(); final File dir = DirectoryUtils.tempDir(testName.getMethodName()); final RollCycles rollCycle = RollCycles.TEST_SECONDLY; // write first message try (ChronicleQueue queue = binary(dir) .rollCycle(rollCycle).timeProvider(timeProvider) .build()) { queue.acquireAppender().writeText("first message"); } timeProvider.advanceMillis(2100); // write second message try (ChronicleQueue queue = binary(dir) .rollCycle(rollCycle).timeProvider(timeProvider).build()) { queue.acquireAppender().writeText("second message"); } // read both messages try (ChronicleQueue queue = binary(dir) .rollCycle(rollCycle).timeProvider(timeProvider).build()) { ExcerptTailer tailer = queue.createTailer(); Assert.assertEquals("first message", tailer.readText()); Assert.assertEquals("second message", tailer.readText()); } }
@Test public void testReadingWritingWhenNextCycleIsInSequence() { SetTimeProvider timeProvider = new SetTimeProvider(); final File dir = DirectoryUtils.tempDir(testName.getMethodName()); final RollCycles rollCycle = RollCycles.TEST_SECONDLY; // write first message try (ChronicleQueue queue = binary(dir) .rollCycle(rollCycle).timeProvider(timeProvider).build()) { queue.acquireAppender().writeText("first message"); } timeProvider.advanceMillis(1100); // write second message try (ChronicleQueue queue = binary(dir) .rollCycle(rollCycle).timeProvider(timeProvider).build()) { queue.acquireAppender().writeText("second message"); } // read both messages try (ChronicleQueue queue = binary(dir) .rollCycle(rollCycle).timeProvider(timeProvider).build()) { ExcerptTailer tailer = queue.createTailer(); Assert.assertEquals("first message", tailer.readText()); Assert.assertEquals("second message", tailer.readText()); } }