/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.tck.probe; import org.mule.runtime.core.util.func.CheckedSupplier; public class PollingProber implements Prober { public static final long DEFAULT_TIMEOUT = 1000; public static final long DEFAULT_POLLING_INTERVAL = 100; private final long timeoutMillis; private final long pollDelayMillis; public static void check(long timeoutMillis, long pollDelayMillis, CheckedSupplier<Boolean> probe) { new PollingProber(timeoutMillis, pollDelayMillis).check(new JUnitLambdaProbe(probe)); } public PollingProber() { this(DEFAULT_TIMEOUT, DEFAULT_POLLING_INTERVAL); } public PollingProber(long timeoutMillis, long pollDelayMillis) { this.timeoutMillis = timeoutMillis; this.pollDelayMillis = pollDelayMillis; } @Override public void check(Probe probe) { if (!poll(probe)) { throw new AssertionError(probe.describeFailure()); } } private boolean poll(Probe probe) { Timeout timeout = new Timeout(timeoutMillis); while (true) { if (probe.isSatisfied()) { return true; } else if (timeout.hasTimedOut()) { return false; } else { waitFor(pollDelayMillis); } } } private void waitFor(long duration) { try { Thread.sleep(duration); } catch (InterruptedException e) { throw new IllegalStateException("unexpected interrupt", e); } } }