/* * 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.runtime.core.util; import static java.lang.System.currentTimeMillis; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import org.mule.runtime.core.util.monitor.Expirable; import org.mule.runtime.core.util.monitor.ExpiryMonitor; import org.mule.tck.junit4.AbstractMuleContextTestCase; import org.mule.tck.probe.JUnitLambdaProbe; import org.mule.tck.probe.PollingProber; import org.junit.After; import org.junit.Before; import org.junit.Test; public class ExpiryMonitorTestCase extends AbstractMuleContextTestCase { private static final int EXPIRE_TIME = 300; private static final int EXPIRE_INTERVAL = 100; // Add some time to account for the durations of the expiry process, since it is scheduled with fixed delay private static final int EXPIRE_TIMEOUT = EXPIRE_TIME + EXPIRE_INTERVAL + 100; private static final long DELTA_TIME = 10; private boolean expired = false; private long expiredTime = -1; private ExpiryMonitor monitor; @Before public void before() throws Exception { expired = false; monitor = new ExpiryMonitor("test", EXPIRE_INTERVAL, muleContext, false); } @After public void after() { monitor.dispose(); } @Test public void testExpiry() throws InterruptedException { Expirable e = () -> expire(); monitor.addExpirable(EXPIRE_TIME, MILLISECONDS, e); new PollingProber(EXPIRE_TIMEOUT, 50).check(new JUnitLambdaProbe(() -> { assertThat(expired, is(true)); assertThat(monitor.isRegistered(e), is(false)); return true; })); } @Test public void testNotExpiry() throws InterruptedException { Expirable e = () -> expire(); long startTime = currentTimeMillis(); monitor.addExpirable(EXPIRE_TIME, MILLISECONDS, e); monitor.run(); assertThat(expired, is(false)); new PollingProber(EXPIRE_TIMEOUT, 50).check(new JUnitLambdaProbe(() -> { assertThat(expired, is(true)); assertThat(monitor.isRegistered(e), is(false)); return true; })); assertThat(expiredTime - startTime, greaterThanOrEqualTo(EXPIRE_TIME - DELTA_TIME)); } @Test public void testExpiryWithReset() throws InterruptedException { Expirable e = () -> expire(); monitor.addExpirable(EXPIRE_TIME, MILLISECONDS, e); monitor.run(); assertThat(expired, is(false)); long startTime = currentTimeMillis(); monitor.resetExpirable(e); monitor.run(); assertTrue(!expired); new PollingProber(EXPIRE_TIMEOUT, 50).check(new JUnitLambdaProbe(() -> { assertThat(expired, is(true)); assertThat(monitor.isRegistered(e), is(false)); return true; })); assertThat(expiredTime - startTime, greaterThanOrEqualTo(EXPIRE_TIME - DELTA_TIME)); } @Test public void testNotExpiryWithRemove() throws InterruptedException { Expirable e = () -> expire(); monitor.addExpirable(EXPIRE_TIME, MILLISECONDS, e); monitor.run(); assertThat(expired, is(false)); monitor.removeExpirable(e); Thread.sleep(EXPIRE_TIMEOUT); assertThat(expired, is(false)); assertThat(monitor.isRegistered(e), is(false)); } private void expire() { expiredTime = currentTimeMillis(); expired = true; } }