/*
* $Id$
*
* Copyright 2007 Glencoe Software, Inc. All rights reserved.
* Use is subject to license terms supplied in LICENSE.txt
*/
package ome.server.utests;
import java.sql.Timestamp;
import ome.api.ITypes;
import ome.api.JobHandle;
import ome.api.local.LocalQuery;
import ome.api.local.LocalUpdate;
import ome.conditions.ApiUsageException;
import ome.model.jobs.ImportJob;
import ome.model.jobs.JobStatus;
import ome.security.SecuritySystem;
import ome.services.JobBean;
import ome.services.procs.IProcessManager;
import ome.services.procs.Process;
import ome.system.EventContext;
import org.jmock.Mock;
import org.jmock.MockObjectTestCase;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/**
* @author Josh Moore, josh at glencoesoftware.com
* @since 3.0-Beta2
*/
@Test(groups = { "jobs", "broken" })
public class JobHandleMockTest extends MockObjectTestCase {
protected JobHandle jh;
protected LocalQuery iQuery;
protected LocalUpdate iUpdate;
protected ITypes iTypes;
protected SecuritySystem sec;
protected EventContext ec;
protected IProcessManager pm;
protected Process process;
protected Mock mockQuery, mockUpdate, mockTypes, mockSec, mockEc, mockPm,
mockProcess;
@Override
@BeforeMethod
protected void setUp() throws Exception {
super.setUp();
mockQuery = mock(LocalQuery.class);
mockUpdate = mock(LocalUpdate.class);
mockTypes = mock(ITypes.class);
mockSec = mock(SecuritySystem.class);
mockEc = mock(EventContext.class);
mockPm = mock(IProcessManager.class);
mockProcess = mock(Process.class);
iQuery = (LocalQuery) mockQuery.proxy();
iTypes = (ITypes) mockTypes.proxy();
iUpdate = (LocalUpdate) mockUpdate.proxy();
sec = (SecuritySystem) mockSec.proxy();
pm = (IProcessManager) mockPm.proxy();
process = (Process) mockProcess.proxy();
ec = (EventContext) mockEc.proxy();
org.jmock.core.Stub stub = new org.jmock.core.stub.DefaultResultStub();
mockEc.setDefaultStub(stub);
JobBean jb = new JobBean();
jb.setUpdateService(iUpdate);
jb.setQueryService(iQuery);
jb.setTypesService(iTypes);
jb.setSecuritySystem(sec);
jb.setProcessManager(pm);
jh = jb;
}
void cleanup() throws Exception {
try {
verify();
} finally {
tearDown();
}
}
@Test
public void testSubmit() throws Exception {
mockSec.expects(atLeastOnce()).method("getEventContext").will(
returnValue(ec));
mockUpdate.expects(once()).method("saveAndReturnObject").will(
returnValue(new ImportJob(1L, true)));
mockPm.expects(once()).method("process");
jh.submit(new ImportJob());
cleanup();
}
@Test(expectedExceptions = ApiUsageException.class)
public void testAttachUnknown() throws Exception {
mockQuery.expects(once()).method("get").will(returnValue(null));
jh.attach(1L);
cleanup();
}
@Test
public void testAttachKnown() throws Exception {
ImportJob job = jobWithStatus("Submitted");
mockQuery.expects(once()).method("get").will(returnValue(job));
register();
JobStatus rv = jh.attach(1L);
assertTrue(rv == job.getStatus());
cleanup();
}
@Test
public void testJobFinished() throws Exception {
ImportJob job = jobWithStatus("Finished");
job.setFinished(new Timestamp(0L));
willGetJob(job);
register();
jh.attach(1L);
assertTrue(jh.jobFinished() != null);
cleanup();
}
@Test
public void testJobNotFinished() throws Exception {
ImportJob job = jobWithStatus("NotFinished");
willGetJob(job);
register();
jh.attach(1L);
assertTrue(jh.jobFinished() == null);
cleanup();
}
@Test
public void testJobDies() throws Exception {
fail("NYI");
}
@Test
public void testCallbackGetsUnregistered() throws Exception {
fail("NYI");
}
@Test
public void testNotificationReturnsAlmostImmediately() throws Exception {
fail("NYI");
}
@Test(expectedExceptions = ApiUsageException.class)
public void testNoAttachOrSubmit() throws Exception {
jh.jobFinished();
}
@Test
public void testConstantsHaventChanged() {
assertEquals(JobHandle.SUBMITTED, "Submitted");
assertEquals(JobHandle.RESUBMITTED, "Resubmitted");
assertEquals(JobHandle.QUEUED, "Queued");
assertEquals(JobHandle.REQUEUED, "Requeued");
assertEquals(JobHandle.WAITING, "Waiting");
assertEquals(JobHandle.FINISHED, "Finished");
assertEquals(JobHandle.ERROR, "Error");
assertEquals(JobHandle.RUNNING, "Running");
}
// Helpers ~
// =========================================================================
ImportJob jobWithStatus(String statusStr) {
JobStatus status = new JobStatus(statusStr);
ImportJob job = new ImportJob();
job.setStatus(status);
return job;
}
private void willGetJob(ImportJob job) {
mockQuery.expects(once()).method("get").will(returnValue(job));
}
private void register() {
mockPm.expects(once()).method("runningProcess").will(
returnValue(process));
mockProcess.expects(once()).method("isActive").will(returnValue(true));
mockProcess.expects(once()).method("registerCallback");
}
}