package org.dcache.srm.scheduler;
import com.google.common.collect.Lists;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.util.List;
import org.dcache.srm.request.BringOnlineFileRequest;
import org.dcache.srm.request.BringOnlineRequest;
import org.dcache.srm.request.CopyFileRequest;
import org.dcache.srm.request.CopyRequest;
import org.dcache.srm.request.GetFileRequest;
import org.dcache.srm.request.GetRequest;
import org.dcache.srm.request.Job;
import org.dcache.srm.request.LsFileRequest;
import org.dcache.srm.request.LsRequest;
import org.dcache.srm.request.PutFileRequest;
import org.dcache.srm.request.PutRequest;
import org.dcache.srm.request.ReserveSpaceRequest;
import static org.dcache.srm.scheduler.State.INPROGRESS;
import static org.dcache.srm.scheduler.State.UNSCHEDULED;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
import static org.mockito.BDDMockito.*;
@RunWith(PowerMockRunner.class)
@PrepareForTest({Scheduler.class, CopyRequest.class, CopyFileRequest.class,
GetRequest.class, GetFileRequest.class, PutRequest.class, PutFileRequest.class,
BringOnlineRequest.class, BringOnlineFileRequest.class,
LsRequest.class, LsFileRequest.class, ReserveSpaceRequest.class})
public class SchedulerContainerTests
{
SchedulerContainer container;
Scheduler getScheduler;
Scheduler lsScheduler;
Scheduler putScheduler;
Scheduler bringOnlineScheduler;
Scheduler reserveSpaceScheduler;
Scheduler genericScheduler;
private Scheduler mockScheduler(Class<? extends Job> type, String id)
{
Scheduler scheduler = PowerMockito.mock(Scheduler.class);
given(scheduler.getType()).willReturn(type);
given(scheduler.getId()).willReturn(id);
return scheduler;
}
private <T extends Job> T mockJob(Class<T> type)
{
return mockJob(type, UNSCHEDULED, null);
}
private <T extends Job> T mockJob(Class<T> type, State state, String schedulerId)
{
T job = PowerMockito.mock(type);
given(job.getSchedulerType()).willCallRealMethod();
given(job.getState()).willReturn(state);
given(job.getSchedulerId()).willReturn(schedulerId);
return job;
}
@Before
public void setup()
{
getScheduler = mockScheduler(GetFileRequest.class, "get_localhost");
lsScheduler = mockScheduler(LsFileRequest.class, "ls_localhost");
putScheduler = mockScheduler(PutFileRequest.class, "put_localhost");
bringOnlineScheduler = mockScheduler(BringOnlineFileRequest.class, "bring_online_localhost");
reserveSpaceScheduler = mockScheduler(ReserveSpaceRequest.class, "reserve_space_localhost");
genericScheduler = mockScheduler(Job.class, "copy_localhost");
container = new SchedulerContainer();
List<Scheduler<?>> schedulers = Lists.<Scheduler<?>>newArrayList(getScheduler,
lsScheduler, putScheduler, bringOnlineScheduler,
reserveSpaceScheduler, genericScheduler);
container.setSchedulers(schedulers);
}
/* Check correct scheduler is selected when new Job is created */
@Test
public void shouldScheduleCopyRequest() throws Exception
{
CopyRequest job = mockJob(CopyRequest.class);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
container.schedule(job);
verify(job, times(1)).scheduleWith(schedCapture.capture());
assertThat(schedCapture.getValue(), is(genericScheduler));
}
@Test
public void shouldScheduleCopyFileRequest() throws Exception
{
CopyFileRequest job = mockJob(CopyFileRequest.class);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
container.schedule(job);
verify(job, times(1)).scheduleWith(schedCapture.capture());
assertThat(schedCapture.getValue(), is(genericScheduler));
}
@Test
public void shouldScheduleGetRequest() throws Exception
{
GetRequest job = mockJob(GetRequest.class);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
container.schedule(job);
verify(job, times(1)).scheduleWith(schedCapture.capture());
assertThat(schedCapture.getValue(), is(getScheduler));
}
@Test
public void shouldScheduleGetFileRequest() throws Exception
{
GetFileRequest job = mockJob(GetFileRequest.class);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
container.schedule(job);
verify(job, times(1)).scheduleWith(schedCapture.capture());
assertThat(schedCapture.getValue(), is(getScheduler));
}
@Test
public void shouldScheduleBringOnlineRequest() throws Exception
{
BringOnlineRequest job = mockJob(BringOnlineRequest.class);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
container.schedule(job);
verify(job, times(1)).scheduleWith(schedCapture.capture());
assertThat(schedCapture.getValue(), is(bringOnlineScheduler));
}
@Test
public void shouldScheduleBringOnlineFileRequest() throws Exception
{
BringOnlineFileRequest job = mockJob(BringOnlineFileRequest.class);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
container.schedule(job);
verify(job, times(1)).scheduleWith(schedCapture.capture());
assertThat(schedCapture.getValue(), is(bringOnlineScheduler));
}
@Test
public void shouldScheduleLsFileRequest() throws Exception
{
LsFileRequest job = mockJob(LsFileRequest.class);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
container.schedule(job);
verify(job, times(1)).scheduleWith(schedCapture.capture());
assertThat(schedCapture.getValue(), is(lsScheduler));
}
@Test
public void shouldScheduleLsRequest() throws Exception
{
LsRequest job = mockJob(LsRequest.class);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
container.schedule(job);
verify(job, times(1)).scheduleWith(schedCapture.capture());
assertThat(schedCapture.getValue(), is(lsScheduler));
}
@Test
public void shouldSchedulePutFileRequest() throws Exception
{
PutFileRequest job = mockJob(PutFileRequest.class);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
container.schedule(job);
verify(job, times(1)).scheduleWith(schedCapture.capture());
assertThat(schedCapture.getValue(), is(putScheduler));
}
@Test
public void shouldSchedulePutRequest() throws Exception
{
PutRequest job = mockJob(PutRequest.class);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
container.schedule(job);
verify(job, times(1)).scheduleWith(schedCapture.capture());
assertThat(schedCapture.getValue(), is(putScheduler));
}
@Test
public void shouldScheduleReserveSpaceRequest() throws Exception
{
ReserveSpaceRequest job = mockJob(ReserveSpaceRequest.class);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
container.schedule(job);
verify(job, times(1)).scheduleWith(schedCapture.capture());
assertThat(schedCapture.getValue(), is(reserveSpaceScheduler));
}
/* Check correct scheduler is selected when restoring a Job after SRM restart */
/* We don't test most of the container requests as they don't do any
* scheduling on SRM restart */
@Test
public void shouldScheduleRestoredLsFileRequests() throws Exception
{
LsFileRequest job = mockJob(LsFileRequest.class, INPROGRESS, "ls_localhost");
container.restoreJobsOnSrmStart(Lists.newArrayList(job), false);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
verify(job, times(1)).onSrmRestart(schedCapture.capture(), eq(false));
assertThat(schedCapture.getValue(), is(lsScheduler));
}
@Test
public void shouldScheduleRestoredBringOnlineFileRequests() throws Exception
{
BringOnlineFileRequest job = mockJob(BringOnlineFileRequest.class,
INPROGRESS, "bring_online_localhost");
container.restoreJobsOnSrmStart(Lists.newArrayList(job), false);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
verify(job, times(1)).onSrmRestart(schedCapture.capture(), eq(false));
assertThat(schedCapture.getValue(), is(bringOnlineScheduler));
}
@Test
public void shouldScheduleRestoredGetFileRequests() throws Exception
{
GetFileRequest job = mockJob(GetFileRequest.class, INPROGRESS,
"get_localhost");
container.restoreJobsOnSrmStart(Lists.newArrayList(job), false);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
verify(job, times(1)).onSrmRestart(schedCapture.capture(), eq(false));
assertThat(schedCapture.getValue(), is(getScheduler));
}
@Test
public void shouldScheduleRestoredCopyRequests() throws Exception
{
CopyRequest job = mockJob(CopyRequest.class, INPROGRESS, "copy_localhost");
container.restoreJobsOnSrmStart(Lists.newArrayList(job), false);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
verify(job, times(1)).onSrmRestart(schedCapture.capture(), eq(false));
assertThat(schedCapture.getValue(), is(genericScheduler));
}
@Test
public void shouldScheduleRestoredCopyFileRequests() throws Exception
{
CopyFileRequest job = mockJob(CopyFileRequest.class, INPROGRESS,
"copy_localhost");
container.restoreJobsOnSrmStart(Lists.newArrayList(job), false);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
verify(job, times(1)).onSrmRestart(schedCapture.capture(), eq(false));
assertThat(schedCapture.getValue(), is(genericScheduler));
}
@Test
public void shouldScheduleRestoredPutFileRequests() throws Exception
{
PutFileRequest job = mockJob(PutFileRequest.class, INPROGRESS,
"put_localhost");
container.restoreJobsOnSrmStart(Lists.newArrayList(job), false);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
verify(job, times(1)).onSrmRestart(schedCapture.capture(), eq(false));
assertThat(schedCapture.getValue(), is(putScheduler));
}
@Test
public void shouldScheduleRestoredReserveSpaceRequests() throws Exception
{
ReserveSpaceRequest job = mockJob(ReserveSpaceRequest.class, INPROGRESS,
"reserve_space_localhost");
container.restoreJobsOnSrmStart(Lists.newArrayList(job), false);
ArgumentCaptor<Scheduler> schedCapture = ArgumentCaptor.forClass(Scheduler.class);
verify(job, times(1)).onSrmRestart(schedCapture.capture(), eq(false));
assertThat(schedCapture.getValue(), is(reserveSpaceScheduler));
}
}