package hudson.plugins.ec2;
import com.amazonaws.AmazonClientException;
import hudson.slaves.NodeProperty;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class EC2RetentionStrategyTest {
@Rule
public JenkinsRule r = new JenkinsRule();
final AtomicBoolean idleTimeoutCalled = new AtomicBoolean(false);
@Test
public void testOnBillingHourRetention() throws Exception {
EC2RetentionStrategy rs = new EC2RetentionStrategy("-2");
List<int[]> upTime = new ArrayList<int[]>();
List<Boolean> expected = new ArrayList<Boolean>();
upTime.add(new int[] { 58, 0 });
expected.add(true);
upTime.add(new int[] { 57, 59 });
expected.add(false);
upTime.add(new int[] { 59, 00 });
expected.add(true);
upTime.add(new int[] { 59, 30 });
expected.add(true);
upTime.add(new int[] { 60, 00 });
expected.add(false);
for (int i = 0; i < upTime.size(); i++) {
int[] t = upTime.get(i);
EC2Computer computer = computerWithIdleTime(t[0], t[1]);
rs.check(computer);
assertEquals("Expected " + t[0] + "m" + t[1] + "s to be " + expected.get(i), (boolean) expected.get(i), idleTimeoutCalled.get());
// reset the assumption
idleTimeoutCalled.set(false);
}
}
private EC2Computer computerWithIdleTime(final int minutes, final int seconds) throws Exception {
final EC2AbstractSlave slave = new EC2AbstractSlave("name", "id", "description", "fs", 1, null, "label", null, null, "init", "tmpDir", new ArrayList<NodeProperty<?>>(), "remote", "jvm", false, "idle", null, "cloud", false, false, Integer.MAX_VALUE, null) {
@Override
public void terminate() {
}
@Override
public String getEc2Type() {
return null;
}
@Override
void idleTimeout() {
idleTimeoutCalled.set(true);
}
};
EC2Computer computer = new EC2Computer(slave) {
@Override
public EC2AbstractSlave getNode() {
return slave;
}
@Override
public long getUptime() throws AmazonClientException, InterruptedException {
return ((minutes * 60L) + seconds) * 1000L;
}
@Override
public boolean isOffline() {
return false;
}
};
assertTrue(computer.isIdle());
assertTrue(computer.isOnline());
return computer;
}
}