/*
* JBoss, Home of Professional Open Source
* Copyright 2010, Red Hat, Inc., and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.cdi.tck.test.util;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
import java.util.concurrent.TimeUnit;
import org.jboss.cdi.tck.impl.ConfigurationFactory;
import org.jboss.cdi.tck.util.Timer;
import org.jboss.cdi.tck.util.Timer.ResolutionLogic;
import org.jboss.cdi.tck.util.Timer.StopCondition;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.testng.internal.thread.ThreadTimeoutException;
public class TimerTest {
@BeforeMethod
public void beforeTestMethod() {
ConfigurationFactory.get().setTestTimeoutFactor(100);
}
@Test(timeOut = 1000l, expectedExceptions = { ThreadTimeoutException.class })
public void testNoCondition() throws InterruptedException {
new Timer().setDelay(2000l).start();
}
@Test(timeOut = 1000l)
public void testSingleCondition() throws InterruptedException {
Timer timer = new Timer().setDelay(5000l).addStopCondition(new StopCondition() {
@Override
public boolean isSatisfied() {
return true;
}
}).start();
assertTrue(timer.isStopConditionsSatisfiedBeforeTimeout());
}
@Test(timeOut = 1000l)
public void testMultipleConditionDisjunction() throws InterruptedException {
Timer timer = new Timer().setDelay(5000l).addStopCondition(new StopCondition() {
@Override
public boolean isSatisfied() {
return true;
}
}).addStopCondition(new StopCondition() {
@Override
public boolean isSatisfied() {
return false;
}
}).start();
assertTrue(timer.isStopConditionsSatisfiedBeforeTimeout());
}
@Test(timeOut = 1000l, expectedExceptions = { ThreadTimeoutException.class })
public void testMultipleConditionConjunction() throws InterruptedException {
new Timer().setDelay(5000l).setResolutionLogic(ResolutionLogic.CONJUNCTION).addStopCondition(new StopCondition() {
@Override
public boolean isSatisfied() {
return true;
}
}).addStopCondition(new StopCondition() {
@Override
public boolean isSatisfied() {
return false;
}
}).start();
}
@Test(timeOut = 5000l)
public void testReuse() throws InterruptedException {
// Will be stopped immediately
Timer timer = new Timer().setDelay(2000l).addStopCondition(new StopCondition() {
@Override
public boolean isSatisfied() {
return true;
}
}).start();
assertTrue(timer.isStopConditionsSatisfiedBeforeTimeout());
// Will be stopped after timeout (2s) exceeds
timer.addStopCondition(new StopCondition() {
@Override
public boolean isSatisfied() {
return false;
}
}, true).start();
assertFalse(timer.isStopConditionsSatisfiedBeforeTimeout());
timer.reset();
// And finally half-second
timer.setDelay(500l);
timer.start();
}
@Test(timeOut = 1000l, expectedExceptions = { ThreadTimeoutException.class })
public void testTimeoutFactor() throws InterruptedException {
ConfigurationFactory.get().setTestTimeoutFactor(200);
new Timer().setDelay(1000).start();
}
@Test
public void testTimeUnits() {
Timer timer = new Timer();
timer.setDelay(2, TimeUnit.SECONDS);
assertEquals(2000, timer.getDelay());
timer.setDelay(1, TimeUnit.MINUTES);
assertEquals(60000, timer.getDelay());
try {
timer.setDelay(-10, TimeUnit.MILLISECONDS);
fail();
} catch (IllegalArgumentException e) {
// Expected
}
try {
timer.setDelay(0);
fail();
} catch (IllegalArgumentException e) {
// Expected
}
}
@Test
public void testDelayAdjustment() {
ConfigurationFactory.get().setTestTimeoutFactor(200);
Timer timer = new Timer();
timer.setDelay(2, TimeUnit.SECONDS);
assertEquals(4000, timer.getDelay());
timer.setDelay(10);
assertEquals(20, timer.getDelay());
ConfigurationFactory.get().setTestTimeoutFactor(25);
timer.setDelay(888);
assertEquals(222, timer.getDelay());
timer.setDelay(13);
assertEquals(4, timer.getDelay());
}
@Test(expectedExceptions = { IllegalStateException.class })
public void testNoDelaySet() throws InterruptedException {
new Timer().start();
}
}