/** * Copyright (C) 2010 BonitaSoft S.A. * BonitaSoft, 31 rue Gustave Eiffel - 38000 Grenoble * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2.0 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.bonitasoft.simulation; import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.GregorianCalendar; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.PriorityQueue; import java.util.Properties; import java.util.Set; import junit.framework.TestCase; import org.bonitasoft.simulation.engine.ResourcePool; import org.bonitasoft.simulation.engine.RuntimeResource; import org.bonitasoft.simulation.engine.SimulationEngine; import org.bonitasoft.simulation.model.Period; import org.bonitasoft.simulation.model.RepartitionType; import org.bonitasoft.simulation.model.TimeUnit; import org.bonitasoft.simulation.model.instance.ResourceInstance; import org.bonitasoft.simulation.model.instance.RuntimeTask; import org.bonitasoft.simulation.model.instance.SimActivityInstance; import org.bonitasoft.simulation.model.instance.SimProcessInstance; import org.bonitasoft.simulation.model.loadprofile.InjectionPeriod; import org.bonitasoft.simulation.model.loadprofile.LoadProfile; import org.bonitasoft.simulation.model.process.JoinType; import org.bonitasoft.simulation.model.process.SimActivity; import org.bonitasoft.simulation.model.process.SimProcess; import org.bonitasoft.simulation.model.resource.Resource; import org.bonitasoft.simulation.reporting.CSVSimReportStorage; /** * @author Romain Bioteau * */ public class TestSimulation extends TestCase { @Override protected void setUp() throws Exception { super.setUp(); Thread.sleep(10000) ; } public void testHourScaleExecutionLowDensityProfileNoDelay() throws Exception { Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY, 0) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, SimulationTestUtil.getHoursIntoMilliseconds(24)*7*4) ; executionProperties.put(SimulationEngine.FLUSH_STORE, false) ; final SimulationEngine engine = new SimulationEngine(SimulationTestUtil.createProcessDefinition(),SimulationTestUtil.createLoadProfileWithLowDensity(),SimulationTestUtil.createResources(),executionProperties); engine.start(); validateExecution(engine); } public void testCycleProcess() throws Exception { List<Resource> ressources = new ArrayList<Resource>(); Resource employee = new Resource("R&D Team","Developer",40,40,SimulationTestUtil.createWorkingWeekCalendar(),"$",TimeUnit.HOUR,0,20); Resource saler = new Resource("Sales Team","Saler",30,20,SimulationTestUtil.createWorkingWeekCalendar(),"$",TimeUnit.HOUR,0,25); Resource trucks = new Resource("Truck","Truck",30,00,SimulationTestUtil.createWorkingWeekCalendar(),"$",TimeUnit.DAY,0,40); Resource it = new Resource("IT","IT",30,20,SimulationTestUtil.createWorkingWeekCalendar(),"$",TimeUnit.HOUR,0,15); ressources.add(employee); ressources.add(saler); ressources.add(trucks); ressources.add(it) ; SimProcess proc = SimulationTestUtil.createCycleProc() ; Calendar myInstance = GregorianCalendar.getInstance() ; List<InjectionPeriod> injections = new ArrayList<InjectionPeriod>(); myInstance.set(2010, 6, 1, 0, 0); long p1Start = myInstance.getTimeInMillis() ; myInstance.add(Calendar.MONTH, 3) ; long p1End = myInstance.getTimeInMillis() ; Period period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,80,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,180,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,100,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,80,RepartitionType.CONSTANT)); LoadProfile lp = new LoadProfile(SimulationTestUtil.createWorkingWeekCalendar(), injections); Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY, 0) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, 30*SimulationTestUtil.getHoursIntoMilliseconds(24)) ; executionProperties.put(SimulationEngine.FLUSH_STORE, false) ; executionProperties.put(SimulationEngine.EXPORT_MODE, SimulationEngine.PDF_MODE) ; try{ final SimulationEngine engine = new SimulationEngine(proc,lp,ressources,executionProperties); engine.start(); }catch (Exception e) { return ; } fail() ; } public void testXorProcess() throws Exception { List<Resource> ressources = new ArrayList<Resource>(); Resource employee = new Resource("R&D Team","Developer",40,40,SimulationTestUtil.createWorkingWeekCalendar(),"$",TimeUnit.HOUR,0,20); Resource saler = new Resource("Sales Team","Saler",30,20,SimulationTestUtil.createWorkingWeekCalendar(),"$",TimeUnit.HOUR,0,25); Resource trucks = new Resource("Truck","Truck",30,00,SimulationTestUtil.createWorkingWeekCalendar(),"$",TimeUnit.DAY,0,40); Resource it = new Resource("IT","IT",30,20,SimulationTestUtil.createWorkingWeekCalendar(),"$",TimeUnit.HOUR,0,15); ressources.add(employee); ressources.add(saler); ressources.add(trucks); ressources.add(it) ; SimProcess proc = SimulationTestUtil.createXorProc() ; Calendar myInstance = GregorianCalendar.getInstance() ; List<InjectionPeriod> injections = new ArrayList<InjectionPeriod>(); myInstance.set(2010, 6, 1, 0, 0); long p1Start = myInstance.getTimeInMillis() ; myInstance.add(Calendar.MONTH, 3) ; long p1End = myInstance.getTimeInMillis() ; Period period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,80,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,180,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,100,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,80,RepartitionType.CONSTANT)); LoadProfile lp = new LoadProfile(SimulationTestUtil.createWorkingWeekCalendar(), injections); Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY, 0) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, 30*SimulationTestUtil.getHoursIntoMilliseconds(24)) ; executionProperties.put(SimulationEngine.FLUSH_STORE, false) ; final SimulationEngine engine = new SimulationEngine(proc,lp,ressources,executionProperties); engine.start(); validateExecution(engine); } public void testANDProcess() throws Exception { SimProcess proc = SimulationTestUtil.createANDProc() ; Calendar myInstance = GregorianCalendar.getInstance() ; List<InjectionPeriod> injections = new ArrayList<InjectionPeriod>(); myInstance.set(2010, 6, 1, 0, 0); long p1Start = myInstance.getTimeInMillis() ; myInstance.add(Calendar.MONTH, 3) ; long p1End = myInstance.getTimeInMillis() ; Period period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,1,RepartitionType.CONSTANT)) ; LoadProfile lp = new LoadProfile(SimulationTestUtil.createWorkingWeekCalendar(), injections); Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY, 0) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, 30*SimulationTestUtil.getHoursIntoMilliseconds(24)) ; executionProperties.put(SimulationEngine.FLUSH_STORE, false) ; final SimulationEngine engine = new SimulationEngine(proc,lp,new ArrayList<Resource>(),executionProperties); engine.start(); validateExecution(engine); } public void testRealProcess() throws Exception { SimProcess proc = SimulationTestUtil.createRealProc() ; Calendar myInstance = GregorianCalendar.getInstance() ; List<InjectionPeriod> injections = new ArrayList<InjectionPeriod>(); myInstance.set(2010, 6, 1, 0, 0); long p1Start = myInstance.getTimeInMillis() ; myInstance.add(Calendar.MONTH, 3) ; long p1End = myInstance.getTimeInMillis() ; Period period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,800,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,1800,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,1000,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,800,RepartitionType.CONSTANT)); LoadProfile lp = new LoadProfile(SimulationTestUtil.createWorkingWeekCalendar(), injections); Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY, 0) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, 30*SimulationTestUtil.getHoursIntoMilliseconds(24)) ; executionProperties.put(SimulationEngine.FLUSH_STORE, false) ; final SimulationEngine engine = new SimulationEngine(proc,lp,SimulationTestUtil.createRealResources(),executionProperties); engine.start(); validateExecution(engine); } public void testRealProcessWithUnlimitedRDResource() throws Exception { SimProcess proc = SimulationTestUtil.createRealProcWithUnlimitedRD() ; Calendar myInstance = GregorianCalendar.getInstance() ; List<InjectionPeriod> injections = new ArrayList<InjectionPeriod>(); myInstance.set(2010, 6, 1, 0, 0); long p1Start = myInstance.getTimeInMillis() ; myInstance.add(Calendar.MONTH, 3) ; long p1End = myInstance.getTimeInMillis() ; Period period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,800,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,1800,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,1000,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,800,RepartitionType.CONSTANT)); LoadProfile lp = new LoadProfile(SimulationTestUtil.createWorkingWeekCalendar(), injections); Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY, 0) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, 30*SimulationTestUtil.getHoursIntoMilliseconds(24)) ; executionProperties.put(SimulationEngine.FLUSH_STORE, false) ; final SimulationEngine engine = new SimulationEngine(proc,lp,SimulationTestUtil.createRealResourcesWithUnlimitedRD(),executionProperties); engine.start(); validateExecution(engine); } public void testRealProcessFullWorking() throws Exception { List<Resource> ressources = new ArrayList<Resource>(); Resource employee = new Resource("R&D Team","Developer",40,00,SimulationTestUtil.createWorkingAllWeekCalendar(),"$",TimeUnit.HOUR,0,20); Resource saler = new Resource("Sales Team","Saler",30,20,SimulationTestUtil.createWorkingAllWeekCalendar(),"$",TimeUnit.HOUR,0,25); Resource trucks = new Resource("Truck","Truck",30,20,SimulationTestUtil.createWorkingAllWeekCalendar(),"$",TimeUnit.DAY,0,40); Resource it = new Resource("IT","IT",30,20,SimulationTestUtil.createWorkingAllWeekCalendar(),"$",TimeUnit.HOUR,0,15); ressources.add(employee); ressources.add(saler); ressources.add(trucks); ressources.add(it) ; SimProcess proc = SimulationTestUtil.createRealProc() ; Calendar myInstance = GregorianCalendar.getInstance() ; List<InjectionPeriod> injections = new ArrayList<InjectionPeriod>(); myInstance.set(2010, 6, 1, 0, 0); long p1Start = myInstance.getTimeInMillis() ; myInstance.add(Calendar.MONTH, 3) ; long p1End = myInstance.getTimeInMillis() ; Period period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,800,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,1800,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,1000,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,800,RepartitionType.CONSTANT)); LoadProfile lp = new LoadProfile(SimulationTestUtil.createWorkingAllWeekCalendar(), injections); Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY, 0) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, 30*SimulationTestUtil.getHoursIntoMilliseconds(24)) ; executionProperties.put(SimulationEngine.FLUSH_STORE, false) ; final SimulationEngine engine = new SimulationEngine(proc,lp,ressources,executionProperties); engine.start(); validateExecution(engine); } private void validateExecution(final SimulationEngine engine) throws Exception { File[] foundFiles = new File("target").listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { return (dir.getAbsolutePath()+File.separatorChar+name).startsWith(((CSVSimReportStorage)engine.getStore()).getStoredInstanceFilename()) || (dir.getAbsolutePath()+File.separatorChar+name).startsWith(((CSVSimReportStorage)engine.getStore()).getFinishedStoredInstanceFilename()); } }); assertEquals(2,foundFiles.length) ; for(File f: foundFiles){ if(f.getAbsolutePath().startsWith(((CSVSimReportStorage)engine.getStore()).getStoredInstanceFilename())){ f.renameTo(new File(((CSVSimReportStorage)engine.getStore()).getStoredInstanceFilename())) ; } if(f.getAbsolutePath().startsWith(((CSVSimReportStorage)engine.getStore()).getFinishedStoredInstanceFilename())){ f.renameTo(new File(((CSVSimReportStorage)engine.getStore()).getFinishedStoredInstanceFilename())) ; } } checkWorkingPeriodsNotOverlapsEachOther(engine); checkInstancesConsistency(engine); for(File f: foundFiles){ f.delete(); } } public void testRealProcessWithData() throws Exception { List<Resource> resources = SimulationTestUtil.createRealResources(); SimProcess proc = SimulationTestUtil.createRealProcWithData() ; Calendar myInstance = GregorianCalendar.getInstance() ; List<InjectionPeriod> injections = new ArrayList<InjectionPeriod>(); myInstance.set(2010, 6, 1, 0, 0); long p1Start = myInstance.getTimeInMillis() ; myInstance.add(Calendar.MONTH, 3) ; long p1End = myInstance.getTimeInMillis() ; Period period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,800,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,1800,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,1000,RepartitionType.CONSTANT)); p1Start = p1End +1 ; myInstance.setTimeInMillis(p1Start); myInstance.add(Calendar.MONTH, 3) ; p1End = myInstance.getTimeInMillis() ; period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,800,RepartitionType.CONSTANT)); LoadProfile lp = new LoadProfile(SimulationTestUtil.createWorkingWeekCalendar(), injections); Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY, 0) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, 30*SimulationTestUtil.getHoursIntoMilliseconds(24)) ; executionProperties.put(SimulationEngine.FLUSH_STORE, false) ; SimulationEngine engine = new SimulationEngine(proc,lp,resources,executionProperties); engine.start(); validateExecution(engine); } private void checkInstancesConsistency(SimulationEngine engine) throws Exception { } private void checkExecutionDate(SimActivityInstance elem,Set<SimActivityInstance> parsed) { for(SimActivityInstance activity : elem.getNext()){ if(activity.getExecutionDate() != 0){ parsed.add(activity) ; if(((SimActivity) activity.getDefinition()).getJoinType().equals(JoinType.XOR)){ assertTrue("next elem : "+activity.getDefinition().getName()+" starts @ "+activity.getStartDate()+" and elem starts @ "+elem.getStartDate(),activity.getStartDate() >= elem.getStartDate()); } if(activity.hasNext()){ for(SimActivityInstance nextInstance : activity.getNext()){ if(!parsed.contains(nextInstance)){ checkExecutionDate(nextInstance,parsed); } } } } } } public void testHourScaleExecutionLowDensityProfileWithDelay() throws Exception { Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY, 20) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, 30*SimulationTestUtil.getHoursIntoMilliseconds(24)) ; executionProperties.put(SimulationEngine.FLUSH_STORE, false) ; SimulationEngine engine = new SimulationEngine(SimulationTestUtil.createProcessDefinition(),SimulationTestUtil.createLoadProfileWithLowDensity(),SimulationTestUtil.createResources(),executionProperties); engine.start(); validateExecution(engine); } public void testHourScaleExecutionMediumDensityProfileNoDelay() throws Exception { Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY, 0) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, 30*SimulationTestUtil.getHoursIntoMilliseconds(24)) ; executionProperties.put(SimulationEngine.FLUSH_STORE, false) ; SimulationEngine engine = new SimulationEngine(SimulationTestUtil.createProcessDefinition(),SimulationTestUtil.createLoadProfileWithMediumDensity(),SimulationTestUtil.createResources(),executionProperties); engine.start(); validateExecution(engine); } public void testHourScaleProcessExecutionHighDensityProfileNoDelay() throws Exception { Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY, 0) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, 30*SimulationTestUtil.getHoursIntoMilliseconds(24)) ; executionProperties.put(SimulationEngine.FLUSH_STORE, false) ; SimulationEngine engine = new SimulationEngine(SimulationTestUtil.createProcessDefinition(),SimulationTestUtil.createLoadProfileWithHighDensity(),SimulationTestUtil.createResources(),executionProperties); engine.start(); validateExecution(engine); } public void testHourScaleProcessExecutionVeryHighDensityProfileNoDelay() throws Exception { Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY, 0) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, 30*SimulationTestUtil.getHoursIntoMilliseconds(24)) ; executionProperties.put(SimulationEngine.FLUSH_STORE, false) ; SimulationEngine engine = new SimulationEngine(SimulationTestUtil.createProcessDefinition(),SimulationTestUtil.createLoadProfileWithVeryHighDensity(),SimulationTestUtil.createResources(),executionProperties); engine.start(); validateExecution(engine); } public void testHourScaleProcessExecutionVeryHighDensityProfileWithDelay() throws Exception { Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY, 10) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, SimulationTestUtil.getHoursIntoMilliseconds(24)*30) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; executionProperties.put(SimulationEngine.FLUSH_STORE, false) ; SimulationEngine engine = new SimulationEngine(SimulationTestUtil.createProcessDefinition(),SimulationTestUtil.createLoadProfileWithVeryHighDensity(),SimulationTestUtil.createResources(),executionProperties); engine.start(); validateExecution(engine); } public void testTodoListSize() throws Exception { Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY, 10) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, SimulationTestUtil.getHoursIntoMilliseconds(24)*30) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; SimulationEngine engine = new SimulationEngine(SimulationTestUtil.createProcessDefinition(),SimulationTestUtil.createLoadProfileWithHighDensity(),SimulationTestUtil.createResources(),executionProperties); engine.createTodoList(); assertEquals(engine.getLoadProfile().getTotalInjectedInstances(), engine.getStore().getStoredProcessInstances(-1).size()) ; } public void testHourScaleProcessExecutionHighDensityProfileWithDelay() throws Exception { Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY, 20) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, SimulationTestUtil.getHoursIntoMilliseconds(24)*30) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; executionProperties.put(SimulationEngine.FLUSH_STORE, false) ; SimulationEngine engine = new SimulationEngine(SimulationTestUtil.createProcessDefinition(),SimulationTestUtil.createLoadProfileWithHighDensity(),SimulationTestUtil.createResources(),executionProperties); engine.start(); validateExecution(engine); } public void testCreateTodoList() throws Exception{ List<InjectionPeriod> injections = new ArrayList<InjectionPeriod>(); Calendar myInstance = GregorianCalendar.getInstance(); myInstance .set(2010, 6, 1, 0, 0); long p1Start = myInstance.getTimeInMillis() ; myInstance.add(Calendar.MONTH, 3) ; long p1End = myInstance.getTimeInMillis() ; Period period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,10000,RepartitionType.CONSTANT)); LoadProfile lp = new LoadProfile(SimulationTestUtil.createWorkingWeekCalendar(), injections); Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY, 10) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, SimulationTestUtil.getHoursIntoMilliseconds(24)*30) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; SimulationEngine engine = new SimulationEngine(SimulationTestUtil.createProcessDefinition(),lp,SimulationTestUtil.createResources(),executionProperties); engine.createTodoList() ; PriorityQueue<RuntimeTask> todoList = new PriorityQueue<RuntimeTask>(); List<SimProcessInstance> instances = engine.getStore().getStoredProcessInstances(-1 ) ; for(SimProcessInstance instance : instances){ for(SimActivityInstance startActivity : instance.getStartElemInstances()){ todoList.add(new RuntimeTask(startActivity,instance.getStartDate())); } } Iterator<RuntimeTask> it = todoList.iterator(); while (it.hasNext()) { RuntimeTask runtimeTask = (RuntimeTask) it.next(); assertTrue("Starting time has unavailable time : "+runtimeTask.getStartDate(), engine.getLoadProfile().getInjectionCalendar().isPlanningAvailable(runtimeTask.getStartDate())); //$NON-NLS-1$ } int totalInstances = 0 ; for(InjectionPeriod p : engine.getLoadProfile().getInjectionPeriods()){ totalInstances = totalInstances + p.getNumberOfInstance() ; } assertEquals("Missing or too many instances planned",totalInstances, todoList.size()); //$NON-NLS-1$ //assertTrue("Bad repartition",((RuntimeTask)todoList.toArray()[todoList.size()-1]).getStartDate() <= lp.getInjectionPeriods().get(lp.getInjectionPeriods().size()-1).getPeriod().getEnd()); //$NON-NLS-1$ } public void testMinuteScaleExecutionLowDensityProfileNoDelay() throws Exception { Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY,0) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, 30*SimulationTestUtil.getHoursIntoMilliseconds(24)) ; executionProperties.put(SimulationEngine.FLUSH_STORE, false) ; Calendar myInstance = GregorianCalendar.getInstance() ; List<InjectionPeriod> injections = new ArrayList<InjectionPeriod>(); myInstance.set(2010, 6, 1, 0, 0); long p1Start = myInstance.getTimeInMillis() ; myInstance.add(Calendar.MONTH, 40) ; long p1End = myInstance.getTimeInMillis() ; Period period1 = new Period(p1Start, p1End) ; injections.add(new InjectionPeriod(period1,15000,RepartitionType.CONSTANT)); LoadProfile lp = new LoadProfile(SimulationTestUtil.createWorkingWeekCalendar(), injections); SimulationEngine engine = new SimulationEngine(SimulationTestUtil.createProcessDefinitionMinuteScaled(),lp,SimulationTestUtil.createResources(),executionProperties); engine.start(); validateExecution(engine); } public void testHourScaleExecutionLowDensityProfileNoDelayAndDataBased() throws Exception { Properties executionProperties = new Properties(); executionProperties.put(SimulationEngine.MAXIMUM_DELAY_ACTIVITY, 0) ; executionProperties.put(SimulationEngine.REPORT_TIMESPAN, SimulationTestUtil.getHoursIntoMilliseconds(24)*30) ; executionProperties.put(SimulationEngine.REPORT_WORKSPACE, new File("target").getAbsolutePath()) ; executionProperties.put(SimulationEngine.FLUSH_STORE, false) ; SimulationEngine engine = new SimulationEngine(SimulationTestUtil.createProcessDefinitionBasedOnData(),SimulationTestUtil.createLoadProfileWithLowDensity(),SimulationTestUtil.createResources(),executionProperties); engine.start(); validateExecution(engine); } private void checkWorkingPeriodsNotOverlapsEachOther(SimulationEngine engine) throws Exception { List<SimProcessInstance> instances = engine.getStore().getStoredFinishedProcessInstances(1000) ; for(SimProcessInstance instance : instances){ SimActivityInstance elem = instance.getStartElemInstances().iterator().next() ; Set<SimActivityInstance> parsed = new HashSet<SimActivityInstance>() ; checkExecutionDate(elem,parsed) ; } checkLockDate(instances) ; for(RuntimeResource r : ResourcePool.getInstance().getResourceInstances().values()){ for(ResourceInstance ri : r.getInstances()){ Object[] array = ri.getPlanning().getWorkingPeriods().toArray(); for(int i = 0 ; i< array.length-1; i++){ Period wp = (Period) array[i]; for(int j= i+1 ; j<array.length;j++){ assertFalse(wp.overlaps(((Period) array[j]))); } } } } } private void checkLockDate(List<SimProcessInstance> instances) throws Exception { for(SimProcessInstance processInstance : instances){ Set<SimActivityInstance> parsed = new HashSet<SimActivityInstance>(); parseProcessInstance(processInstance.getStartElemInstances(), processInstance.getStartElemInstances().iterator().next().getStartDate(),parsed) ; } } private void parseProcessInstance(Set<SimActivityInstance> activityInstances, long previousDate, Set<SimActivityInstance> parsed) { for(SimActivityInstance a : activityInstances){ if(a.getStartDate() != 0){ parsed.add(a) ; if(((SimActivity) a.getDefinition()).getJoinType().equals(JoinType.XOR)){ assertTrue(a.getDefinition().getName() +" starts @ "+a.getStartDate() + " and previous date is "+ previousDate,a.getStartDate() >= previousDate) ; } if(a.hasNext()){ for(SimActivityInstance nextInstance : a.getNext()){ if(!parsed.contains(nextInstance)){ parseProcessInstance(Collections.singleton(nextInstance),a.getFinishDate(),parsed) ; } } } } } } }