package com.breakersoft.plow.test.dao; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.List; import javax.annotation.Resource; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.breakersoft.plow.Job; import com.breakersoft.plow.Node; import com.breakersoft.plow.Proc; import com.breakersoft.plow.dispatcher.DispatchService; import com.breakersoft.plow.dispatcher.NodeDispatcher; import com.breakersoft.plow.dispatcher.dao.DispatchDao; import com.breakersoft.plow.dispatcher.dao.ProcDao; import com.breakersoft.plow.dispatcher.domain.DispatchJob; import com.breakersoft.plow.dispatcher.domain.DispatchNode; import com.breakersoft.plow.dispatcher.domain.DispatchProc; import com.breakersoft.plow.dispatcher.domain.DispatchTask; import com.breakersoft.plow.event.JobLaunchEvent; import com.breakersoft.plow.test.AbstractTest; @RunWith(SpringJUnit4ClassRunner.class) public class ProcDaoTests extends AbstractTest { @Resource DispatchDao dispatchDao; @Resource DispatchService dispatchService; @Resource NodeDispatcher nodeDispatcher; @Resource ProcDao procDao;; private DispatchProc proc; private DispatchTask task; private DispatchNode dnode; private DispatchJob job; @Before public void init() { // This is testing the creation of a proc. Node node = nodeService.createNode(getTestNodePing()); dnode = dispatchDao.getDispatchNode(node.getName()); JobLaunchEvent event = jobService.launch(getTestJobSpec("proc_tests", 2)); job = new DispatchJob(event.getJob()); task = dispatchService.getDispatchableTasks(job, dnode).get(0); proc = dispatchService.allocateProc(dnode, task); } @Test public void testGetProcById() { Proc otherProc = procDao.getProc(proc.getProcId()); assertEquals(proc.getProcId(), otherProc.getProcId()); assertEquals(proc.getHostname(), otherProc.getHostname()); assertEquals(proc.getNodeId(), otherProc.getNodeId()); assertEquals(proc.getTaskId(), otherProc.getTaskId()); } @Test public void testGetProcByTask() { Proc otherProc = procDao.getProc(task); assertEquals(proc.getProcId(), otherProc.getProcId()); assertEquals(proc.getHostname(), otherProc.getHostname()); assertEquals(proc.getNodeId(), otherProc.getNodeId()); assertEquals(proc.getTaskId(), otherProc.getTaskId()); } @Test public void testDelete() { assertTrue(procDao.delete(proc)); assertFalse(procDao.delete(proc)); } @Test public void testProcsByJob() { Job job = jobService.getJob(task.getJobId()); List<Proc> procs = procDao.getProcs(job); assertEquals(1, procs.size()); assertEquals(proc.getProcId(), procs.get(0).getProcId()); assertTrue(procs.contains(proc)); } @Test public void assignAndUnassignProc() { assertTrue(procDao.unassign(proc)); assertTrue(procDao.assign(proc, task)); // Verify all running core counts. assertEquals(1, jdbc().queryForInt("SELECT int_cores_run FROM job_dsp WHERE pk_job=?", task.getJobId())); assertEquals(1, jdbc().queryForInt("SELECT int_cores_run FROM folder_dsp WHERE pk_folder=(SELECT pk_folder FROM job WHERE pk_job=?)", job.getJobId())); assertEquals(1, jdbc().queryForInt("SELECT int_cores_run FROM layer_dsp WHERE pk_layer=?", task.getLayerId())); assertEquals(1, jdbc().queryForInt("SELECT int_cores - int_idle_cores FROM node_dsp WHERE pk_node=?", proc.getNodeId())); assertEquals(1, jdbc().queryForInt("SELECT int_cores_run FROM quota WHERE pk_quota=?", proc.getQuotaId())); // Task is in a different layer DispatchTask nextTask = dispatchService.getDispatchableTasks(job, dnode).get(1); assertTrue(procDao.unassign(proc)); assertTrue(procDao.assign(proc, nextTask)); assertFalse(procDao.assign(proc, nextTask)); // Verify all running core counts. Basically all the same except the layer changes. assertEquals(1, jdbc().queryForInt("SELECT int_cores_run FROM job_dsp WHERE pk_job=?", task.getJobId())); assertEquals(1, jdbc().queryForInt("SELECT int_cores_run FROM folder_dsp WHERE pk_folder=(SELECT pk_folder FROM job WHERE pk_job=?)", job.getJobId())); assertEquals(0, jdbc().queryForInt("SELECT int_cores_run FROM layer_dsp WHERE pk_layer=?", task.getLayerId())); assertEquals(1, jdbc().queryForInt("SELECT int_cores_run FROM layer_dsp WHERE pk_layer=?", nextTask.getLayerId())); assertEquals(1, jdbc().queryForInt("SELECT int_cores - int_idle_cores FROM node_dsp WHERE pk_node=?", proc.getNodeId())); assertEquals(1, jdbc().queryForInt("SELECT int_cores_run FROM quota WHERE pk_quota=?", proc.getQuotaId())); } public void testSetProcUnbooked() { } }