public void freezeTime() {
        embeddedEventLoop().freezeTime();
    }
@Test
    @Timeout(30) // generous timeout, just make sure we don't actually wait for the full 10 mins...
    void testFreezeTime() {
        EmbeddedChannel channel = new EmbeddedChannel();
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
            }
        };

        channel.freezeTime();
        // this future will complete after 10min
        ScheduledFuture<?> future10 = channel.eventLoop().schedule(runnable, 10, TimeUnit.MINUTES);
        // this future will complete after 10min + 1ns
        ScheduledFuture<?> future101 = channel.eventLoop().schedule(runnable,
                TimeUnit.MINUTES.toNanos(10) + 1, TimeUnit.NANOSECONDS);
        // this future will complete after 20min
        ScheduledFuture<?> future20 = channel.eventLoop().schedule(runnable, 20, TimeUnit.MINUTES);

        channel.runPendingTasks();
        assertFalse(future10.isDone());
        assertFalse(future101.isDone());
        assertFalse(future20.isDone());

        channel.advanceTimeBy(10, TimeUnit.MINUTES);
        channel.runPendingTasks();
        assertTrue(future10.isDone());
        assertFalse(future101.isDone());
        assertFalse(future20.isDone());

        channel.unfreezeTime();
        channel.runPendingTasks();
        assertTrue(future101.isDone());
        assertFalse(future20.isDone());
    }