@Test public void testRandomMove() throws Exception { final Map<Long, String> messageByIndex = new HashMap<>(); try (ChronicleQueue queue = SingleChronicleQueueBuilder. binary(tmpFolder.newFolder()).build()) { // create a queue and add some excerpts final ExcerptAppender appender = queue.acquireAppender(); for (int i = 0; i < 10; i++) { final String message = "msg" + i; appender.writeDocument(w -> w.write("message").object(message)); final long appendIndex = appender.lastIndexAppended(); messageByIndex.put(appendIndex, message); } final Random random = new Random(1510298038000L); final List<Long> indices = new ArrayList<>(messageByIndex.keySet()); final ExcerptTailer tailer = queue.createTailer(); final AtomicReference<String> capturedMessage = new AtomicReference<>(); for (int i = 0; i < 100; i++) { final long randomIndex = indices.get(random.nextInt(messageByIndex.keySet().size())); tailer.moveToIndex(randomIndex); tailer.readDocument(w -> capturedMessage.set((String) w.read("message").object())); assertEquals(messageByIndex.get(randomIndex), capturedMessage.get()); tailer.readDocument(w -> w.read("message").object()); } } }
appender.writeDocument(writer -> writer.getValueOut().text(tmpText)); tailer.readDocument(reader -> reader.getValueIn().textTo(tmpReadback)); String actual = tmpReadback.toString(); Assert.assertEquals(problematic[p].length(), actual.length());
@Test public void testSimpleWire() { try (final ChronicleQueue chronicle = builder(getTmpDir(), this.wireType) .build()) { final ExcerptAppender appender = chronicle.acquireAppender(); appender.writeDocument(wire -> wire.write(() -> "FirstName").text("Steve")); appender.writeDocument(wire -> wire.write(() -> "Surname").text("Jobs")); StringBuilder first = new StringBuilder(); StringBuilder surname = new StringBuilder(); final ExcerptTailer tailer = chronicle.createTailer(); tailer.readDocument(wire -> wire.read(() -> "FirstName").text(first)); tailer.readDocument(wire -> wire.read(() -> "Surname").text(surname)); Assert.assertEquals("Steve Jobs", first + " " + surname); } }
@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 testIndex() { try (final ChronicleQueue queue = builder(getTmpDir(), this.wireType) .rollCycle(RollCycles.HOURLY) .build()) { final ExcerptAppender appender = queue.acquireAppender(); int cycle = appender.cycle(); // create 100 documents for (int i = 0; i < 5; i++) { final int j = i; appender.writeDocument(wire -> wire.write(() -> "key").text("value=" + j)); if (i == 2) { final long cycle1 = queue.rollCycle().toCycle(appender.lastIndexAppended()); Assert.assertEquals(cycle1, cycle); } } final ExcerptTailer tailer = queue.createTailer(); assertTrue(tailer.moveToIndex(queue.rollCycle().toIndex(cycle, 2))); StringBuilder sb = new StringBuilder(); tailer.readDocument(wire -> wire.read(() -> "key").text(sb)); Assert.assertEquals("value=2", sb.toString()); tailer.readDocument(wire -> wire.read(() -> "key").text(sb)); Assert.assertEquals("value=3", sb.toString()); tailer.readDocument(wire -> wire.read(() -> "key").text(sb)); Assert.assertEquals("value=4", sb.toString()); } }
@Test public void testToEndOnDeletedQueueFiles() throws IOException { if (OS.isWindows()) { System.err.println("#460 Cannot test delete after close on windows"); return; } File dir = getTmpDir(); try (ChronicleQueue q = builder(dir, wireType).build()) { ExcerptAppender append = q.acquireAppender(); append.writeDocument(w -> w.write(() -> "test").text("before text")); ExcerptTailer tailer = q.createTailer(); // move to the end even though it doesn't exist yet. tailer.toEnd(); append.writeDocument(w -> w.write(() -> "test").text("text")); assertTrue(tailer.readDocument(w -> w.read(() -> "test").text("text", Assert::assertEquals))); Files.find(dir.toPath(), 1, (p, basicFileAttributes) -> p.toString().endsWith("cq4"), FileVisitOption.FOLLOW_LINKS) .forEach(path -> assertTrue(path.toFile().delete())); ChronicleQueue q2 = builder(dir, wireType).build(); tailer = q2.createTailer(); tailer.toEnd(); assertEquals(TailerState.UNINITIALISED, tailer.state()); append = q2.acquireAppender(); append.writeDocument(w -> w.write(() -> "test").text("before text")); assertTrue(tailer.readDocument(w -> w.read(() -> "test").text("before text", Assert::assertEquals))); } }
@Test public void test() { File dir = getTmpDir(); try (final ChronicleQueue queue = SingleChronicleQueueBuilder.builder(dir, wireType) .testBlockSize() .build()) { final ExcerptTailer tailer = queue.createTailer(); assertFalse(tailer.readDocument(r -> r.read(TestKey.test).int32())); final ExcerptAppender appender = queue.acquireAppender(); appender.writeDocument(w -> w.write(TestKey.test).int32(1)); Jvm.pause(100); assertTrue(tailer.readDocument(r -> r.read(TestKey.test).int32())); } }
final ExcerptTailer tailer = queue.createTailer(); for (int i = 0; i < 2; ) { boolean read = tailer.readDocument(r -> { int result = r.read(TestKey.test).int32(); results[result] = result;
private void read(@NotNull ChronicleQueue aChronicle, int expected) { final ExcerptTailer myTailer = aChronicle.createTailer(); final int myLast = HOURLY.toCycle(myTailer.toEnd().index()); final int myFirst = HOURLY.toCycle(myTailer.toStart().index()); int myCycle = myFirst - 1; long myIndex = HOURLY.toIndex(myCycle, 0); int count = 0; while (myCycle <= myLast) { // System.out.println(Long.toHexString(myIndex)); if (myTailer.moveToIndex(myIndex)) { while (myTailer.readDocument(read())) { count++; } } myIndex = HOURLY.toIndex(++myCycle, 0); } Assert.assertEquals(expected, count); }
@Ignore("long running test") @Test public void testReadAtIndex4MB() { try (final ChronicleQueue queue = SingleChronicleQueueBuilder.builder(getTmpDir(), this.wireType).rollCycle(SMALL_DAILY) .build()) { final ExcerptAppender appender = queue.acquireAppender(); System.out.print("Percent written="); for (long i = 0; i < TIMES; i++) { final long j = i; appender.writeDocument(wire -> wire.write(() -> "key").text("value=" + j)); if (i % (TIMES / 20) == 0) { System.out.println("" + (i * 100 / TIMES) + "%, "); } } long lastIndex = appender.lastIndexAppended(); final int cycle = queue.rollCycle().toCycle(lastIndex); final ExcerptTailer tailer = queue.createTailer(); // QueueDumpMain.dump(file, new PrintWriter(System.out)); StringBuilder sb = new StringBuilder(); for (long i = 0; i < (4L << 20L); i++) { assertTrue(tailer.moveToIndex(queue.rollCycle().toIndex(cycle, i))); tailer.readDocument(wire -> wire.read(() -> "key").text(sb)); Assert.assertEquals("value=" + i, sb.toString()); if (i % (TIMES / 20) == 0) { System.out.println("Percent read= " + (i * 100 / TIMES) + "%"); } } } }
@Test public void testNegativeEPOC() { for (int h = -14; h <= 14; h++) { try (final ChronicleQueue chronicle = builder(getTmpDir(), wireType) .epoch(TimeUnit.HOURS.toMillis(h)) .build()) { final ExcerptAppender appender = chronicle.acquireAppender(); appender.writeDocument(wire -> wire.write(() -> "key").text("value=v")); chronicle.createTailer() .readDocument(wire -> { assertEquals("value=v", wire.read("key").text()); }); } } }
@Test public void testHeaderIndexReadAtIndex() { try (final ChronicleQueue queue = builder(getTmpDir(), this.wireType) .build()) { final ExcerptAppender appender = queue.acquireAppender(); final int cycle = appender.cycle(); // create 100 documents for (int i = 0; i < 100; i++) { final int j = i; appender.writeDocument(wire -> wire.write(() -> "key").text("value=" + j)); } final ExcerptTailer tailer = queue.createTailer(); assertTrue(tailer.moveToIndex(queue.rollCycle().toIndex(cycle, 0))); StringBuilder sb = new StringBuilder(); tailer.readDocument(wire -> wire.read(() -> "key").text(sb)); Assert.assertEquals("value=0", sb.toString()); } }
@Test public void testTail() { File basePath = getTmpDir(); try (ChronicleQueue queue = ChronicleQueue.singleBuilder(basePath) .testBlockSize() .build()) { checkNoFiles(basePath); ExcerptTailer tailer = queue.createTailer(); checkNoFiles(basePath); tailer.toStart(); checkNoFiles(basePath); assertFalse(tailer.readDocument(d -> { })); checkNoFiles(basePath); } }
@Test public void shouldHandleCycleRoll() { File dir = getTmpDir(); MutableTimeProvider timeProvider = new MutableTimeProvider(); timeProvider.setTime(System.currentTimeMillis()); try (ChronicleQueue chronicle = minutely(dir, timeProvider) .build(); ChronicleQueue chronicle2 = minutely(dir, timeProvider) .build()) { //ExcerptAppender append = chronicle2.acquireAppender(); //append.writeDocument(w -> w.write(() -> "test").text("before text")); ExcerptTailer tailer = chronicle.createTailer(); //tailer.toEnd(); timeProvider.addTime(10, TimeUnit.MINUTES); ExcerptAppender append = chronicle2.acquireAppender(); append.writeDocument(w -> w.write(() -> "test").text("text")); assertTrue(tailer.readDocument(w -> w.read(() -> "test").text("text", Assert::assertEquals))); } }
@Test public void testToEndBeforeWrite() { try (ChronicleQueue chronicle = builder(getTmpDir(), wireType) .rollCycle(TEST2_DAILY) .build()) { ExcerptAppender appender = chronicle.acquireAppender(); ExcerptTailer tailer = chronicle.createTailer(); int entries = chronicle.rollCycle().defaultIndexSpacing() * 2 + 2; for (int i = 0; i < entries; i++) { tailer.toEnd(); int finalI = i; appender.writeDocument(w -> w.writeEventName("hello").text("world" + finalI)); tailer.readDocument(w -> w.read().text("world" + finalI, Assert::assertEquals)); } } }
@Test public void testToEnd2() { File dir = getTmpDir(); try (ChronicleQueue chronicle = builder(dir, wireType) .build(); ChronicleQueue chronicle2 = builder(dir, wireType) .build()) { ExcerptAppender append = chronicle2.acquireAppender(); append.writeDocument(w -> w.write(() -> "test").text("before text")); ExcerptTailer tailer = chronicle.createTailer(); // move to the end even though it doesn't exist yet. tailer.toEnd(); append.writeDocument(w -> w.write(() -> "test").text("text")); assertTrue(tailer.readDocument(w -> w.read(() -> "test").text("text", Assert::assertEquals))); } }
@Test public void testSomeMessages() { try (ChronicleQueue chronicle = builder(getTmpDir(), wireType) .rollCycle(TEST2_DAILY) .build()) { ExcerptAppender appender = chronicle.acquireAppender(); ExcerptTailer tailer = chronicle.createTailer(); int entries = chronicle.rollCycle().defaultIndexSpacing() * 2 + 2; for (long i = 0; i < entries; i++) { long finalI = i; appender.writeDocument(w -> w.writeEventName("hello").int64(finalI)); long seq = chronicle.rollCycle().toSequenceNumber(appender.lastIndexAppended()); assertEquals(i, seq); // System.out.println(chronicle.dump()); tailer.readDocument(w -> w.read().int64(finalI, (a, b) -> Assert.assertEquals((long) a, b))); } } }
@Test public void testAppendAndRead() { try (final ChronicleQueue queue = builder(getTmpDir(), this.wireType) .build()) { final ExcerptAppender appender = queue.acquireAppender(); final int cycle = appender.cycle(); for (int i = 0; i < 10; i++) { final int n = i; appender.writeDocument(w -> w.write(TestKey.test).int32(n)); assertEquals(n, queue.rollCycle().toSequenceNumber(appender.lastIndexAppended())); } final ExcerptTailer tailer = queue.createTailer(); // Sequential read for (int i = 0; i < 10; i++) { final int n = i; assertTrue(tailer.readDocument(r -> assertEquals(n, r.read(TestKey.test).int32()))); assertEquals(n + 1, queue.rollCycle().toSequenceNumber(tailer.index())); } // Random read for (int i = 0; i < 10; i++) { final int n = i; assertTrue("n: " + n, tailer.moveToIndex(queue.rollCycle().toIndex(cycle, n))); assertTrue("n: " + n, tailer.readDocument(r -> assertEquals(n, r.read(TestKey.test).int32()))); assertEquals(n + 1, queue.rollCycle().toSequenceNumber(tailer.index())); } } }
@Test public void testAppendAndReadAtIndex() { try (final ChronicleQueue queue = builder(getTmpDir(), this.wireType) .rollCycle(TEST2_DAILY) .build()) { final ExcerptAppender appender = queue.acquireAppender(); appender.cycle(); for (int i = 0; i < 5; i++) { final int n = i; appender.writeDocument(w -> w.write(TestKey.test).int32(n)); assertEquals(i, queue.rollCycle().toSequenceNumber(appender.lastIndexAppended())); } final ExcerptTailer tailer = queue.createTailer(); for (int i = 0; i < 5; i++) { final long index = queue.rollCycle().toIndex(appender.cycle(), i); assertTrue(tailer.moveToIndex(index)); final int n = i; assertTrue(tailer.readDocument(r -> assertEquals(n, queue.rollCycle().toSequenceNumber(r.read(TestKey.test) .int32())))); long index2 = tailer.index(); long sequenceNumber = queue.rollCycle().toSequenceNumber(index2); assertEquals(n + 1, sequenceNumber); } } }
/** * @param consumer a consumer that provides that name of the event and value contained within * the except */ public void getExcerpt(@NotNull BiConsumer<CharSequence, M> consumer) { @NotNull final ExcerptTailer tailer = threadLocalTailer(); tailer.readDocument(w -> { final StringBuilder eventName = Wires.acquireStringBuilder(); @NotNull final ValueIn valueIn = w.readEventName(eventName); consumer.accept(eventName, valueIn.object(elementTypeClass)); }); }