/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package hudson.plugins.disk_usage;
import hudson.triggers.Trigger;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import jenkins.util.Timer;
import junit.framework.TestCase;
import org.junit.Test;
/**
*
* @author lucinka
*/
public class DiskUsageCalculationTest extends TestCase{
/**
* Depends on test testReschedule() - if testReshedule fails this test probably will fail too.
*
* see @testReschedule()
*/
@Test
public void testScheduledExecutionTime() throws Exception{
// Trigger.timer = new Timer("Jenkins cron thread"); // it should be enought there is no need to start Jenkins
GregorianCalendar calendar = new GregorianCalendar();
calendar.add(Calendar.MINUTE, 10);
int minute = calendar.get(Calendar.MINUTE);
// attribut currentTask should have value calculation
TestDiskUsageCalculation calculation = (TestDiskUsageCalculation) new TestDiskUsageCalculation(minute + " * * * *", false);
if(calculation.getLastTask()!=null){
//should not be any, but if cancel;
calculation.getLastTask().cancel();
}
Long expectedNextExecution = calendar.getTimeInMillis();
assertEquals("Scheduled time of disk usage calculation should 0, because calculation is not scheduled", 0, calculation.scheduledLastInstanceExecutionTime(), 60000);
Timer.get().schedule(calculation.getNewInstance(), calculation.getRecurrencePeriod(), TimeUnit.MILLISECONDS);
assertEquals("Scheduled time of disk usage calculation should be in 10 minutes", expectedNextExecution, calculation.scheduledLastInstanceExecutionTime(), 60000);
//scheduled time should be changed if configuration of cron is changed
calendar.add(Calendar.MINUTE, 10);
minute = calendar.get(Calendar.MINUTE);
calculation.setCron(minute + " * * * *");
calculation.reschedule();
expectedNextExecution = calendar.getTimeInMillis();
assertEquals("Scheduled time of disk usage calculation should be changed", expectedNextExecution, calculation.scheduledLastInstanceExecutionTime(), 60000);
}
@Test
public void testGetRecurrencePeriod(){
GregorianCalendar calendar = new GregorianCalendar();
//for minutes
int minute = calendar.get(Calendar.MINUTE);
minute = minute + 2;
calendar.add(Calendar.MINUTE, 2);
minute = calendar.get(Calendar.MINUTE);
TestDiskUsageCalculation calculation = new TestDiskUsageCalculation(minute + " * * * *", false);
Long period = calculation.getRecurrencePeriod();
Long expectedPeriod = calendar.getTimeInMillis() - System.currentTimeMillis();
assertEquals("Disk usage calculation should be executed accurately in 2 minutes", expectedPeriod, period, 60000);
//for hours
calendar = new GregorianCalendar();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
calendar.add(Calendar.HOUR_OF_DAY, 2); //add 2 hours
hour = calendar.get(Calendar.HOUR_OF_DAY);
calendar.set(Calendar.MINUTE, 0);
calculation = new TestDiskUsageCalculation("0 " + hour + " * * *", false);
period = calculation.getRecurrencePeriod();
expectedPeriod = calendar.getTimeInMillis() - System.currentTimeMillis();
assertEquals("Disk usage calculaion should be executed accurately in 2 hours.", expectedPeriod, period, 60000);
//for days
calendar = new GregorianCalendar();
calendar.add(Calendar.DAY_OF_MONTH, 2);
int day = calendar.get(Calendar.DAY_OF_MONTH);
calculation = new TestDiskUsageCalculation(calendar.get(Calendar.MINUTE) + " " + calendar.get(Calendar.HOUR_OF_DAY) + " " + day + " * *", false);
period = calculation.getRecurrencePeriod();
expectedPeriod = calendar.getTimeInMillis() - System.currentTimeMillis();
assertEquals("Disk usage calculaion should be executed accurately in 2 days.", expectedPeriod, period, 60000);
//for months
calendar = new GregorianCalendar();
calendar.add(Calendar.MONTH, 2);
int month = calendar.get(Calendar.MONTH) + 1; //months are indexed from 0
calculation = new TestDiskUsageCalculation(calendar.get(Calendar.MINUTE) + " " + calendar.get(Calendar.HOUR_OF_DAY) + " " + calendar.get(Calendar.DAY_OF_MONTH) + " " + month + " *", false);
period = calculation.getRecurrencePeriod();
expectedPeriod = calendar.getTimeInMillis() - System.currentTimeMillis();
calendar.setTimeInMillis(System.currentTimeMillis() + period);
assertEquals("Disk usage calculaion should be executed accurately in 2 months.", expectedPeriod, period, 60000);
//day of week
calendar = new GregorianCalendar();
calendar.add(Calendar.DAY_OF_WEEK, 2);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) -1;
calculation = new TestDiskUsageCalculation(calendar.get(Calendar.MINUTE) + " " + calendar.get(Calendar.HOUR_OF_DAY) + " " + calendar.get(Calendar.DAY_OF_MONTH) + " " + (calendar.get(Calendar.MONTH) + 1) + " " + dayOfWeek, false);
period = calculation.getRecurrencePeriod();
expectedPeriod = calendar.getTimeInMillis() - System.currentTimeMillis();
calendar.setTimeInMillis(System.currentTimeMillis() + period);;
assertEquals("Disk usage calculaion should be executed accurately in 2 months.", expectedPeriod, period, 60000);
}
/**
* Depends on test testScheduledExecutionTime() - if testReshedule fails this test probably will fail too.
*
* see @testScheduledExecutionTime()
*/
@Test
public void testReschedule() throws Exception{
//Trigger.timer = new Timer("Jenkins cron thread");
GregorianCalendar calendar = new GregorianCalendar();
calendar.add(Calendar.MINUTE, 10);
int minute = calendar.get(Calendar.MINUTE);
// attribut currentTask should have value calculation
TestDiskUsageCalculation calculation = (TestDiskUsageCalculation) new TestDiskUsageCalculation(minute + " * * * *", true).getNewInstance();
Timer.get().schedule(calculation, calculation.getRecurrencePeriod(), TimeUnit.MILLISECONDS); //schedule it;
calendar.add(Calendar.MINUTE, 10);
minute = calendar.get(Calendar.MINUTE);
calculation.setCron(minute + " * * * *");
calculation.reschedule(); // should cancel this calculation and schedule new instance
// try{
// System.out.println("new schedule");
// calculation.doRun();
// }
// catch(IllegalArgumentException e){
// fail("Calculation should be canceled.");
// }
assertEquals("A new calculation should be scheduled with a new scheduled time.", calendar.getTimeInMillis(), calculation.scheduledLastInstanceExecutionTime(), 60000);
}
@Test
public void testTaskIsScheduledOnlyOneTimesPerMinute() throws Exception{
// Trigger.timer = new Timer("Jenkins cron thread");
// attribut currentTask should have value calculation
List<TestDiskUsageCalculation> scheduledInstances = new ArrayList<TestDiskUsageCalculation>();
TestDiskUsageCalculation calculation = (TestDiskUsageCalculation) new TestDiskUsageCalculation("* * * * *", false).getNewInstance();
TestDiskUsageCalculation.startLoadInstancesHistory(scheduledInstances);
GregorianCalendar calendar = new GregorianCalendar();
int seconds = calendar.get(Calendar.SECOND);
boolean firstLoop = true;
while((seconds>55 && seconds<59) || seconds==0){ //have enought time for measure in current minute
if(firstLoop){
System.out.println("Waiting for appropriate time ");
firstLoop = false;
}
else{
System.out.println(".");
}
Thread.sleep(1000);
seconds = calendar.get(Calendar.SECOND);
}
calculation.doRun();
Thread.sleep(2000);
assertEquals("Method getRecurencePeriod should not able to schedule more than 1 task in 1 minute", 1, scheduledInstances.size());
TestDiskUsageCalculation.stopLoadInstancesHistory();
}
}