/*******************************************************************************
* Copyright (c) 2008, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* VMware Inc. - initial contribution
*******************************************************************************/
package org.eclipse.virgo.kernel.deployer.core.internal;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
import org.eclipse.virgo.kernel.deployer.core.internal.BlockingSignal;
import org.junit.Test;
/**
*/
public class DeployerBlockingSignalTests {
private static final long TEST_PERIOD = 2; //Seconds
/**
* Test method for {@link org.eclipse.virgo.kernel.deployer.core.internal.BlockingSignal#awaitCompletion(long)}.
* @throws DeploymentException
*/
@Test
public void testAwaitCompletionBlock() throws DeploymentException {
BlockingSignal blockingSignal = new BlockingSignal(true);
long start = System.nanoTime();
boolean awaitCompletion = blockingSignal.awaitCompletion(TEST_PERIOD);
long finish = System.nanoTime();
assertFalse(awaitCompletion);
assertTrue(finish - start > TEST_PERIOD * 1000 * 1000);
}
/**
* Test method for {@link org.eclipse.virgo.kernel.deployer.core.internal.BlockingSignal#awaitCompletion(long)}.
* @throws DeploymentException
*/
@Test
public void testAwaitCompletionBlockSucceed() throws DeploymentException {
BlockingSignal blockingSignal = new BlockingSignal(true);
long start = System.currentTimeMillis();
this.launchThread(blockingSignal, TEST_PERIOD/2);
boolean awaitCompletion = blockingSignal.awaitCompletion(TEST_PERIOD);
long finish = System.currentTimeMillis();
assertTrue(awaitCompletion);
assertTrue(finish - start < TEST_PERIOD * 1000);
}
/**
* Test method for {@link org.eclipse.virgo.kernel.deployer.core.internal.BlockingSignal#awaitCompletion(long)}.
* @throws DeploymentException
*/
@Test
public void testAwaitCompletionNoBlock() throws DeploymentException {
BlockingSignal blockingSignal = new BlockingSignal(false);
long start = System.currentTimeMillis();
boolean awaitCompletion = blockingSignal.awaitCompletion(TEST_PERIOD);
long finish = System.currentTimeMillis();
assertFalse(awaitCompletion);
assertTrue(finish - start < TEST_PERIOD * 1000);
}
/**
* Test method for {@link org.eclipse.virgo.kernel.deployer.core.internal.BlockingSignal#checkComplete()}.
* @throws DeploymentException
*/
@Test
public void testCheckCompleteBlockFast() throws DeploymentException {
BlockingSignal blockingSignal = new BlockingSignal(true);
long start = System.currentTimeMillis();
this.launchThread(blockingSignal, TEST_PERIOD/2);
boolean checkCompletion = blockingSignal.checkComplete();
long finish = System.currentTimeMillis();
assertTrue(checkCompletion);
assertTrue(finish - start < TEST_PERIOD * 1000);
}
/**
* Test method for {@link org.eclipse.virgo.kernel.deployer.core.internal.BlockingSignal#checkComplete()}.
* @throws DeploymentException
*/
@Test
public void testCheckCompleteBlockSlow() throws DeploymentException {
BlockingSignal blockingSignal = new BlockingSignal(true);
long start = System.currentTimeMillis();
this.launchThread(blockingSignal, TEST_PERIOD + 1);
boolean checkCompletion = blockingSignal.checkComplete();
long finish = System.currentTimeMillis();
assertTrue(checkCompletion);
assertTrue(finish - start > TEST_PERIOD * 1000);
}
/**
* Test method for {@link org.eclipse.virgo.kernel.deployer.core.internal.BlockingSignal#checkComplete()}.
* @throws DeploymentException
*/
@Test
public void testCheckCompleteNoBlock() throws DeploymentException {
BlockingSignal blockingSignal = new BlockingSignal(false);
long start = System.currentTimeMillis();
boolean checkCompletion = blockingSignal.checkComplete();
long finish = System.currentTimeMillis();
assertFalse(checkCompletion);
assertTrue(finish - start < TEST_PERIOD * 1000);
}
private void launchThread(BlockingSignal blockingSignal, long seconds) {
SignalSucceeder signalSucceeder = new SignalSucceeder(blockingSignal, seconds * 1000);
new Thread(signalSucceeder).start();
}
private static class SignalSucceeder implements Runnable{
private final long timeOut;
private final BlockingSignal blockingSignal;
public SignalSucceeder(BlockingSignal blockingSignal, long timeOut) {
this.blockingSignal = blockingSignal;
this.timeOut = timeOut;
}
public void run() {
try {
Thread.sleep(this.timeOut);
} catch (InterruptedException e) {
System.out.println("Sleep interupted");
}
this.blockingSignal.signalSuccessfulCompletion();
}
}
}