JobScheduler { public List<JobDefinition> createNewSchedule(){ if(!canExecuteMore()){ logger.info("Cannot schedule more jobs"); return null; } logger.info("Creating new schedule with "+currentSchedule.getClass().getSimpleName()); List<JobDefinition> jobs = currentSchedule.createNewSchedule(); for (JobDefinition job : jobs) { ClassInfo classInfo = this.projectData.getClassInfo(job.cut); classInfo.setTimeBudgetInSeconds(job.seconds); classInfo.setMemoryInMB(job.memoryInMB); } return jobs; } JobScheduler(ProjectStaticData projectData,
			CtgConfiguration conf); void chooseScheduleType(AvailableSchedule schedule); List<JobDefinition> createNewSchedule(); boolean canExecuteMore(); ProjectStaticData getProjectData(); CtgConfiguration getConfiguration();  }
@Test public void testBudget() { String[] cuts = new String[] { SomeInterface.class.getName(), NoBranches.class.getName(), SomeBranches.class.getName(), MoreBranches.class.getName() }; ProjectAnalyzer analyzer = new ProjectAnalyzer(cuts); ProjectStaticData data = analyzer.analyze(); int cores = 2; int memory = 1400; int budget = 2; CtgConfiguration conf = new CtgConfiguration(memory, cores, budget, 1, false, AvailableSchedule.BUDGET); JobScheduler scheduler = new JobScheduler(data, conf); List<JobDefinition> jobs = scheduler.createNewSchedule(); Assert.assertNotNull(jobs); Assert.assertEquals(3, jobs.size()); for (JobDefinition job : jobs) { Assert.assertEquals(700, job.memoryInMB); } Assert.assertEquals(MoreBranches.class.getName(), jobs.get(0).cut); Assert.assertEquals(SomeBranches.class.getName(), jobs.get(1).cut); Assert.assertEquals(NoBranches.class.getName(), jobs.get(2).cut); long dif01 = jobs.get(0).seconds - jobs.get(1).seconds; long dif12 = jobs.get(1).seconds - jobs.get(2).seconds; Assert.assertTrue("" + dif01, dif01 > 0); Assert.assertTrue("" + dif12, dif12 > 0); int sum = jobs.get(0).seconds + jobs.get(1).seconds + jobs.get(2).seconds; Assert.assertTrue("wrong value " + sum, sum <= (cores * budget * 60)); }
@Test public void testNonExceedingBudget() { String[] cuts = new String[] { NoBranches.class.getName(), Trivial.class.getName(), MoreBranches.class.getName() }; ProjectAnalyzer analyzer = new ProjectAnalyzer(cuts); ProjectStaticData data = analyzer.analyze(); int cores = 2; int memory = 1400; int budget = 10; CtgConfiguration conf = new CtgConfiguration(memory, cores, budget, 1, false, AvailableSchedule.BUDGET); JobScheduler scheduler = new JobScheduler(data, conf); List<JobDefinition> jobs = scheduler.createNewSchedule(); Assert.assertNotNull(jobs); Assert.assertEquals(3, jobs.size()); for (JobDefinition job : jobs) { Assert.assertEquals(700, job.memoryInMB); } Assert.assertEquals(MoreBranches.class.getName(), jobs.get(0).cut); Assert.assertEquals(Trivial.class.getName(), jobs.get(1).cut); Assert.assertEquals(NoBranches.class.getName(), jobs.get(2).cut); long dif01 = jobs.get(0).seconds - jobs.get(1).seconds; long dif12 = jobs.get(1).seconds - jobs.get(2).seconds; Assert.assertTrue("" + dif01, dif01 > 0); Assert.assertTrue("" + dif12, dif12 > 0); int sum = jobs.get(0).seconds + jobs.get(1).seconds + jobs.get(2).seconds; Assert.assertTrue("wrong value " + sum, sum <= (cores * budget * 60)); for(JobDefinition job : jobs){ Assert.assertTrue("wrong "+job.seconds, job.seconds <= budget * 60); } }
@Test public void testSimple() { String[] cuts = new String[] { SomeInterface.class.getName(), NoBranches.class.getName(), SomeBranches.class.getName(), MoreBranches.class.getName() }; ProjectAnalyzer analyzer = new ProjectAnalyzer(cuts); ProjectStaticData data = analyzer.analyze(); int cores = 2; int memory = 1400; int budget = 2; CtgConfiguration conf = new CtgConfiguration(memory, cores, budget, 1, false, AvailableSchedule.SIMPLE); JobScheduler scheduler = new JobScheduler(data, conf); List<JobDefinition> jobs = scheduler.createNewSchedule(); Assert.assertNotNull(jobs); Assert.assertEquals(3, jobs.size()); for (JobDefinition job : jobs) { Assert.assertEquals(700, job.memoryInMB); } Assert.assertEquals(jobs.get(0).seconds, jobs.get(1).seconds); Assert.assertEquals(jobs.get(2).seconds, jobs.get(1).seconds); int sum = jobs.get(0).seconds + jobs.get(1).seconds + jobs.get(2).seconds; Assert.assertTrue("wrong value " + sum, sum <= (cores * budget * 60)); }
@Test public void testSeeding() { String[] cuts = new String[] { BaseForSeeding.class.getName(), NoBranches.class.getName(), MoreBranches.class.getName(), SomeInterface.class.getName(), SomeInterfaceImpl.class.getName(), SomeBranches.class.getName(), OnlyAbstract.class.getName(), OnlyAbstractImpl.class.getName(), Trivial.class.getName() }; ProjectAnalyzer analyzer = new ProjectAnalyzer(cuts); ProjectStaticData data = analyzer.analyze(); int cores = 3; int memory = 1800; int budget = 3; CtgConfiguration conf = new CtgConfiguration(memory, cores, budget, 1, false, AvailableSchedule.SEEDING); JobScheduler scheduler = new JobScheduler(data, conf); List<JobDefinition> jobs = scheduler.createNewSchedule(); Assert.assertNotNull(jobs); for (JobDefinition job : jobs) { Assert.assertEquals(600, job.memoryInMB); } Assert.assertEquals("Wrong number of jobs: " + jobs.toString(), 8, jobs.size()); JobDefinition seeding = null; for (JobDefinition job : jobs) { if (job.cut.equals(BaseForSeeding.class.getName())) { seeding = job; break; } } Assert.assertNotNull(seeding); Set<String> in = seeding.inputClasses; Assert.assertNotNull(in); System.out.println(in.toString()); Assert.assertTrue(in.contains(NoBranches.class.getName())); Assert.assertTrue(in.contains(SomeBranches.class.getName())); Assert.assertTrue(in.contains(SomeInterfaceImpl.class.getName())); Assert.assertTrue(in.contains(OnlyAbstractImpl.class.getName())); Assert.assertEquals(5, in.size()); }
@Test public void testSeedingOrder() { String[] cuts = new String[] { Simple.class.getName(), UsingSimpleAndTrivial.class.getName(), Trivial.class.getName(), }; ProjectAnalyzer analyzer = new ProjectAnalyzer(cuts); ProjectStaticData data = analyzer.analyze(); int cores = 3; int memory = 1800; int budget = 2; CtgConfiguration conf = new CtgConfiguration(memory, cores, budget, 1, false, AvailableSchedule.SEEDING); JobScheduler scheduler = new JobScheduler(data, conf); List<JobDefinition> jobs = scheduler.createNewSchedule(); Assert.assertNotNull(jobs); Assert.assertEquals("Wrong number of jobs: " + jobs.toString(), 3, jobs.size()); JobDefinition seeding = jobs.get(2); Assert.assertNotNull(seeding); Assert.assertEquals(UsingSimpleAndTrivial.class.getName(), seeding.cut); Set<String> in = seeding.inputClasses; Assert.assertNotNull(in); System.out.println(in.toString()); Assert.assertTrue(in.contains(Simple.class.getName())); Assert.assertTrue(in.contains(Trivial.class.getName())); Assert.assertEquals(2, in.size()); }
@Test public void testSeedingAndBudget() { String[] cuts = new String[] { Trivial.class.getName(), UsingSimpleAndTrivial.class.getName(), Simple.class.getName(), }; ProjectAnalyzer analyzer = new ProjectAnalyzer(cuts); ProjectStaticData data = analyzer.analyze(); int cores = 2; int memory = 1800; int budget = 3; CtgConfiguration conf = new CtgConfiguration(memory, cores, budget, 1, false, AvailableSchedule.BUDGET_AND_SEEDING); JobScheduler scheduler = new JobScheduler(data, conf); List<JobDefinition> jobs = scheduler.createNewSchedule(); Assert.assertNotNull(jobs); Assert.assertEquals("Wrong number of jobs: " + jobs.toString(), 3, jobs.size()); JobDefinition seeding = jobs.get(2); Assert.assertNotNull(seeding); Assert.assertEquals(UsingSimpleAndTrivial.class.getName(), seeding.cut); Set<String> in = seeding.inputClasses; Assert.assertNotNull(in); System.out.println(in.toString()); Assert.assertTrue(in.contains(Simple.class.getName())); Assert.assertTrue(in.contains(Trivial.class.getName())); Assert.assertEquals(2, in.size()); JobDefinition simple = jobs.get(0); Assert.assertNotNull(simple); Assert.assertEquals(Simple.class.getName(), simple.cut); int simpleTime = jobs.get(0).seconds; int trivialTime = jobs.get(1).seconds; int seedingTime = jobs.get(2).seconds; System.out.println("Ordered times: "+simpleTime+", "+trivialTime+", "+seedingTime); Assert.assertTrue(simpleTime > trivialTime); Assert.assertTrue(simpleTime < seedingTime); Assert.assertTrue(trivialTime < seedingTime); }