/** * */ package org.gcube.vremanagement.executor.pluginmanager; import java.util.Calendar; import java.util.HashMap; import java.util.Map; import java.util.UUID; import org.acme.HelloWorldPlugin; import org.acme.HelloWorldPluginDeclaration; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.vremanagement.executor.api.types.LaunchParameter; import org.gcube.vremanagement.executor.api.types.Scheduling; import org.gcube.vremanagement.executor.exception.PluginStateNotRetrievedException; import org.gcube.vremanagement.executor.persistence.SmartExecutorPersistenceConnector; import org.gcube.vremanagement.executor.persistence.SmartExecutorPersistenceConnectorTest; import org.gcube.vremanagement.executor.plugin.PluginState; import org.gcube.vremanagement.executor.scheduler.SmartExecutorScheduler; import org.h2.jdbc.JdbcSQLException; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.quartz.CronExpression; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/ */ public class SmartExecutorSchedulerTest { private static Logger logger = LoggerFactory.getLogger(SmartExecutorSchedulerTest.class); public static final String START = "START"; public static final String END = "END"; public static SmartExecutorPersistenceConnector pc; @BeforeClass public static void prepare() throws Exception{ try { ScopeProvider.instance.set(SmartExecutorPersistenceConnectorTest.GCUBE_DEVSEC_SCOPE); //pc = new JDBCPersistenceConnector("."); //SmartExecutorPersistenceConnector.setPersistenceConnector(pc); pc = SmartExecutorPersistenceConnector.getPersistenceConnector(); } catch (Exception e) { logger.error("Unable to Create SmartExecutorPersistenceConnector"); throw e; } } @AfterClass public static void close() throws Exception{ try { pc.close(); } catch (Exception e) { logger.error("Unable to Close JDBCPersistenceConnector"); throw e; } } public UUID scheduleTest(Scheduling scheduling, Long sleepTime) throws Exception { Map inputs = new HashMap(); if(sleepTime==null){ sleepTime = new Long(10*1000); // 10 sec = 10 * 1000 millisec } inputs.put(HelloWorldPlugin.SLEEP_TIME, sleepTime); inputs.put("Test UUID", UUID.randomUUID()); logger.debug("Inputs : {}", inputs); LaunchParameter parameter = new LaunchParameter(HelloWorldPluginDeclaration.NAME, inputs); parameter.setScheduling(scheduling); SmartExecutorScheduler smartExecutorScheduler = SmartExecutorScheduler.getInstance(); UUID uuid = smartExecutorScheduler.schedule(parameter); logger.debug("Scheduled Job with ID {}", uuid); return uuid; } /* DeprecatedHelloWorldPlugin dependency needed @Test public void deprecatedConstructorTest() throws Exception { Map inputs = new HashMap(); Long sleepTime = new Long(10*1000); // 10 sec = 10 * 1000 millisec inputs.put(DeprecatedHelloWorldPlugin.SLEEP_TIME, sleepTime); inputs.put("Test UUID", UUID.randomUUID()); logger.debug("Inputs : {}", inputs); LaunchParameter parameter = new LaunchParameter(DeprecatedHelloWorldPluginDeclaration.NAME, inputs); parameter.setScheduling(null); SmartExecutorScheduler smartExecutorScheduler = SmartExecutorScheduler.getInstance(); UUID uuid = smartExecutorScheduler.schedule(parameter); logger.debug("Scheduled Job with ID {}", uuid); long startTime = Calendar.getInstance().getTimeInMillis(); long endTime = startTime; while(endTime <= (startTime + 12000)){ endTime = Calendar.getInstance().getTimeInMillis(); } PluginState pluginState = pc.getLastPluginInstanceState(uuid); Assert.assertEquals(PluginState.DONE, pluginState); } */ @Test public void schedulingTest() throws Exception { UUID uuid = scheduleTest(null, null); long startTime = Calendar.getInstance().getTimeInMillis(); long endTime = startTime; while(endTime <= (startTime + 12000)){ endTime = Calendar.getInstance().getTimeInMillis(); } PluginState pluginState = pc.getLastPluginInstanceState(HelloWorldPluginDeclaration.NAME, uuid); Assert.assertEquals(PluginState.DONE, pluginState); @SuppressWarnings("deprecation") PluginState pluginStateFromDeprecation = pc.getLastPluginInstanceState(uuid); Assert.assertEquals(PluginState.DONE, pluginStateFromDeprecation); } @Test public void earlyStopTest() throws Exception { SmartExecutorScheduler smartExecutorScheduler = SmartExecutorScheduler.getInstance(); UUID uuid = scheduleTest(null, null); smartExecutorScheduler.stop(uuid); long startTime = Calendar.getInstance().getTimeInMillis(); long endTime = startTime; while(endTime <= (startTime + 12000)){ endTime = Calendar.getInstance().getTimeInMillis(); } try{ PluginState pluginState = pc.getPluginInstanceState(HelloWorldPluginDeclaration.NAME, uuid, 5); Assert.assertEquals(PluginState.STOPPED, pluginState); @SuppressWarnings("deprecation") PluginState pluginStateFromDeprecation = pc.getPluginInstanceState(uuid, 5); Assert.assertEquals(PluginState.STOPPED, pluginStateFromDeprecation); }catch(JdbcSQLException e){ // OK } } @Test public void middleStopTest() throws Exception { UUID uuid = scheduleTest(null, null); SmartExecutorScheduler smartExecutorScheduler = SmartExecutorScheduler.getInstance(); long startTime = Calendar.getInstance().getTimeInMillis(); long endTime = startTime; while(endTime <= (startTime + 2000)){ endTime = Calendar.getInstance().getTimeInMillis(); } smartExecutorScheduler.stop(uuid); startTime = Calendar.getInstance().getTimeInMillis(); endTime = startTime; while(endTime <= (startTime + 10000)){ endTime = Calendar.getInstance().getTimeInMillis(); } PluginState pluginState = pc.getLastPluginInstanceState(HelloWorldPluginDeclaration.NAME, uuid); Assert.assertEquals(PluginState.STOPPED, pluginState); } @Test public void lateStopTest() throws Exception { UUID uuid = scheduleTest(null, null); SmartExecutorScheduler smartExecutorScheduler = SmartExecutorScheduler.getInstance(); long startTime = Calendar.getInstance().getTimeInMillis(); long endTime = startTime; while(endTime <= (startTime + 12000)){ endTime = Calendar.getInstance().getTimeInMillis(); } smartExecutorScheduler.stop(uuid); PluginState pluginState = pc.getLastPluginInstanceState(HelloWorldPluginDeclaration.NAME, uuid); Assert.assertEquals(PluginState.DONE, pluginState); } @Test public void doubleLaunchfirstStoppedSchedulingTest() throws Exception { UUID first = scheduleTest(null, null); logger.debug("First scheduled id {}", first); UUID second = scheduleTest(null, null); logger.debug("Second scheduled id {}", second); SmartExecutorScheduler smartExecutorScheduler = SmartExecutorScheduler.getInstance(); long startTime = Calendar.getInstance().getTimeInMillis(); long endTime = startTime; while(endTime <= (startTime + 2000)){ endTime = Calendar.getInstance().getTimeInMillis(); } smartExecutorScheduler.stop(first); startTime = Calendar.getInstance().getTimeInMillis(); endTime = startTime; while(endTime <= (startTime + 12000)){ endTime = Calendar.getInstance().getTimeInMillis(); } PluginState pluginState = pc.getLastPluginInstanceState(HelloWorldPluginDeclaration.NAME, first); Assert.assertEquals(PluginState.STOPPED, pluginState); pluginState = pc.getLastPluginInstanceState(HelloWorldPluginDeclaration.NAME, second); Assert.assertEquals(PluginState.DONE, pluginState); } @Test public void delayed() throws Exception { Scheduling scheduling = new Scheduling(20); UUID uuid = scheduleTest(scheduling, new Long(10 * 1000)); SmartExecutorScheduler smartExecutorScheduler = SmartExecutorScheduler.getInstance(); long startTime = Calendar.getInstance().getTimeInMillis(); long endTime = startTime; while(endTime <= (startTime + 83 * 1000)){ endTime = Calendar.getInstance().getTimeInMillis(); } smartExecutorScheduler.stop(uuid); startTime = Calendar.getInstance().getTimeInMillis(); endTime = startTime; while(endTime <= (startTime + 30 * 1000)){ endTime = Calendar.getInstance().getTimeInMillis(); } for(int i=1; i<5; i++){ PluginState pluginState = pc.getPluginInstanceState(HelloWorldPluginDeclaration.NAME, uuid, i); Assert.assertEquals(PluginState.DONE, pluginState); } PluginState pluginState = pc.getPluginInstanceState(HelloWorldPluginDeclaration.NAME, uuid, 5); Assert.assertEquals(PluginState.STOPPED, pluginState); } @Test public void delayedPreviousMustBeTerminated() throws Exception { Scheduling scheduling = new Scheduling(20, true); UUID uuid = scheduleTest(scheduling, new Long(22 * 1000)); SmartExecutorScheduler smartExecutorScheduler = SmartExecutorScheduler.getInstance(); long startTime = Calendar.getInstance().getTimeInMillis(); long endTime = startTime; while(endTime <= (startTime + 80 * 1000)){ endTime = Calendar.getInstance().getTimeInMillis(); } smartExecutorScheduler.stop(uuid); startTime = Calendar.getInstance().getTimeInMillis(); endTime = startTime; while(endTime <= (startTime + 30 * 1000)){ endTime = Calendar.getInstance().getTimeInMillis(); } for(int i=1; i<5; i++){ PluginState pluginState = pc.getPluginInstanceState(HelloWorldPluginDeclaration.NAME, uuid, i); if(i%2==1){ Assert.assertEquals(PluginState.DONE, pluginState); }else{ Assert.assertEquals(PluginState.DISCARDED, pluginState); } } PluginState pluginState = pc.getPluginInstanceState(HelloWorldPluginDeclaration.NAME, uuid, 5); Assert.assertEquals(PluginState.STOPPED, pluginState); } @Test public void delayedAllPreviousMustBeTerminated() throws Exception { Scheduling scheduling = new Scheduling(20, true); UUID uuid = scheduleTest(scheduling, new Long(45 * 1000)); SmartExecutorScheduler smartExecutorScheduler = SmartExecutorScheduler.getInstance(); long startTime = Calendar.getInstance().getTimeInMillis(); long endTime = startTime; while(endTime <= (startTime + 1.5 * 60 * 1000)){ endTime = Calendar.getInstance().getTimeInMillis(); } smartExecutorScheduler.stop(uuid); startTime = Calendar.getInstance().getTimeInMillis(); endTime = startTime; while(endTime <= (startTime + 30 * 1000)){ endTime = Calendar.getInstance().getTimeInMillis(); } PluginState[] expectedStates = new PluginState[]{ PluginState.DONE, PluginState.DISCARDED, PluginState.DISCARDED, PluginState.STOPPED }; for(int i=0; i