@Test public void testCheckIndexWithWriteText() { doTestCheckIndex( (appender, n) -> appender.writeText("Message-" + n) ); }
@Test public void shouldDumpDirectoryListing() throws Exception { final File dataDir = DirectoryUtils.tempDir(DumpQueueMainTest.class.getSimpleName()); try (final ChronicleQueue queue = SingleChronicleQueueBuilder. binary(dataDir). build()) { final ExcerptAppender excerptAppender = queue.acquireAppender(); excerptAppender.writeText("first"); excerptAppender.writeText("last"); final ByteArrayOutputStream capture = new ByteArrayOutputStream(); DumpQueueMain.dump(dataDir, new PrintStream(capture), Long.MAX_VALUE); final String capturedOutput = new String(capture.toByteArray()); assertThat(capturedOutput, containsString("listing.highestCycle")); assertThat(capturedOutput, containsString("listing.lowestCycle")); } }
@Test public void shouldBeAbleToDumpReadOnlyQueueFile() throws Exception { if (OS.isWindows()) return; final File dataDir = DirectoryUtils.tempDir(DumpQueueMainTest.class.getSimpleName()); try (final ChronicleQueue queue = SingleChronicleQueueBuilder. binary(dataDir). build()) { final ExcerptAppender excerptAppender = queue.acquireAppender(); excerptAppender.writeText("first"); excerptAppender.writeText("last"); final Path queueFile = Files.list(dataDir.toPath()). filter(p -> p.toString().endsWith(SingleChronicleQueue.SUFFIX)). findFirst().orElseThrow(() -> new AssertionError("Could not find queue file in directory " + dataDir)); assertThat(queueFile.toFile().setWritable(false), is(true)); final CountingOutputStream countingOutputStream = new CountingOutputStream(); DumpQueueMain.dump(queueFile.toFile(), new PrintStream(countingOutputStream), Long.MAX_VALUE); assertThat(countingOutputStream.bytes, is(not(0L))); } }
appender.writeText(problematic[p]);
ExcerptAppender appender = queue.acquireAppender(); appender.writeText("0"); // to file ...000000 assertEquals(1, tmpDir.listFiles(file -> file.getName().endsWith("cq4")).length); appender.writeText("1"); // to file ...000001 assertEquals(2, tmpDir.listFiles(file -> file.getName().endsWith("cq4")).length); appender.writeText("2"); // to file ...000004 assertEquals(3 + cyclesAdded, tmpDir.listFiles(file -> file.getName().endsWith("cq4")).length);
@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()); } }
@Before public void setup() { chroniclePath = new File(OS.TARGET, "read_only"); try (ChronicleQueue readWrite = ChronicleQueue.singleBuilder(chroniclePath) .readOnly(false) .testBlockSize() .build()) { final ExcerptAppender appender = readWrite.acquireAppender(); appender.writeText(STR1); try (DocumentContext dc = appender.writingDocument()) { dc.wire().bytes().writeUtf8(STR2); } } }
@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 testLastAcknowledge() { String name = OS.getTarget() + "/testLastAcknowledge-" + System.nanoTime(); try (ChronicleQueue q = SingleChronicleQueueBuilder.single(name).testBlockSize().build()) { q.acquireAppender().writeText("Hello World"); } try (ChronicleQueue q = SingleChronicleQueueBuilder.single(name).testBlockSize().build()) { assertEquals(-1, q.lastAcknowledgedIndexReplicated()); } } }
@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); } }
@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 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()); } }
@Test public void testMultipleAppenders() { try (ChronicleQueue syncQ = builder(getTmpDir(), this.wireType) .rollCycle(TEST_DAILY) .build()) { ExcerptAppender syncA = syncQ.acquireAppender(); assumeFalse(syncA.padToCacheAlignMode() == WORD); ExcerptAppender syncB = syncQ.acquireAppender(); ExcerptAppender syncC = syncQ.acquireAppender(); int count = 0; for (int i = 0; i < 3; i++) { syncA.writeText("hello A" + i); assertEquals(count++, (int) syncA.lastIndexAppended()); syncB.writeText("hello B" + i); assertEquals(count++, (int) syncB.lastIndexAppended()); try (DocumentContext dc = syncC.writingDocument(true)) { dc.wire().getValueOut().text("some meta " + i); } } String expected = expectedMultipleAppenders(); assertEquals(expected, syncQ.dump()); } }
@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 shouldMoveToPreviousIndexAfterDocumentIsConsumed() throws Exception { File queuePath = tmpFolder.newFolder("cq"); try (ChronicleQueue queue = ChronicleQueue.singleBuilder(queuePath).build()) { ExcerptAppender appender = queue.acquireAppender(); for (int i = 1; i < 10; ++i) { appender.writeText("id" + i); } ExcerptTailer tailer = queue.createTailer(); assertNext(tailer, "id1"); long index = tailer.index(); assertNext(tailer, "id2"); tailer.moveToIndex(index); assertNext(tailer, "id2"); tailer.moveToIndex(index); assertNext(tailer, "id2"); } }
@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()); } }
try (ChronicleQueue cq = SingleChronicleQueueBuilder.binary(tmp).build()) { for (int i = 0; i < 7; i++) cq.acquireAppender().writeText("test " + i);