@Test public void testHeartBeatThread() throws InterruptedException, ExecutionException, TimeoutException { ProgramStatePublisher programStatePublisher = new MockProgramStatePublisher(); NoOpProgramStateWriter programStateWriter = new NoOpProgramStateWriter(); Assert.assertEquals(0, ((MockProgramStatePublisher) programStatePublisher).getHeartBeatCount()); programStateWriterWithHeartBeat.running(null); Tasks.waitFor(true , () -> ((MockProgramStatePublisher) programStatePublisher).getHeartBeatCount() > 1, 10, TimeUnit.SECONDS, "Didn't receive expected heartbeat after 10 seconds"); Tasks.waitFor(false , () -> programStateWriterWithHeartBeat.isHeartBeatThreadAlive(), 5, TimeUnit.SECONDS, "Heartbeat thread did not stop after 5 seconds"); long heartBeatAfterSuspend = ((MockProgramStatePublisher) programStatePublisher).getHeartBeatCount(); Tasks.waitFor(true , () -> ((MockProgramStatePublisher) programStatePublisher).getHeartBeatCount() > expected, 10, TimeUnit.SECONDS, "Didn't receive expected heartbeat after 10 seconds after resuming program");