@Override
    public boolean tryProcess() {
        return tryProcessInternal(null);
    }
@Test
    public void when_idleTimeout_then_idleMessageAfterTimeout() throws Exception {
        // We can't inject MockClock to EventTimeMapper inside the InsertWatermarkP, so we use real time.
        // We send no events and expect, that after 100 ms WM will be emitted.
        createProcessor(100);

        // let's process some event and expect real WM to be emitted
        resultToCheck.clear();
        long start = System.nanoTime();
        doAndDrain(() -> p.tryProcess(0, item(10)));
        assertEquals(asList(wm(10 - LAG), item(10)), resultToCheck);

        // when no more activity occurs, IDLE_MESSAGE should be emitted again
        resultToCheck.clear();

        long elapsedMs;
        do {
            assertTrue(p.tryProcess());
            elapsedMs = NANOSECONDS.toMillis(System.nanoTime() - start);
            outbox.drainQueueAndReset(0, resultToCheck, false);
            if (elapsedMs < 100) {
                assertTrue("outbox should be empty, elapsedMs=" + elapsedMs, resultToCheck.isEmpty());
            } else if (!resultToCheck.isEmpty()) {
                System.out.println("WM emitted after " + elapsedMs + "ms (shortly after 100 was expected)");
                assertEquals(singletonList(IDLE_MESSAGE), resultToCheck);
                break;
            }
            LockSupport.parkNanos(MILLISECONDS.toNanos(1));
        } while (elapsedMs < 1000);
    }