/**
* Copyright (c) 2009 - 2012 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
* implied, including the implied warranties of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
* along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* Red Hat trademarks are not licensed under GPLv2. No permission is
* granted to use or replicate Red Hat trademarks that are incorporated
* in this software or its documentation.
*/
package org.candlepin.resource;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import org.candlepin.common.exceptions.BadRequestException;
import org.candlepin.common.exceptions.NotFoundException;
import org.candlepin.model.CandlepinQuery;
import org.candlepin.model.JobCurator;
import org.candlepin.model.TransformedCandlepinQuery;
import org.candlepin.pinsetter.core.PinsetterException;
import org.candlepin.pinsetter.core.PinsetterKernel;
import org.candlepin.pinsetter.core.model.JobStatus;
import org.candlepin.pinsetter.core.model.JobStatus.JobState;
import org.candlepin.test.MockResultIterator;
import org.candlepin.util.ElementTransformer;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.xnap.commons.i18n.I18n;
import org.xnap.commons.i18n.I18nFactory;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
/**
* JobResourceTest
*/
public class JobResourceTest {
private JobResource jobResource;
@Mock private JobCurator jobCurator;
@Mock private PinsetterKernel pinsetterKernel;
private I18n i18n;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
i18n = I18nFactory.getI18n(getClass(), Locale.US, I18nFactory.FALLBACK);
jobResource = new JobResource(jobCurator, pinsetterKernel, i18n);
}
private void mockCPQueryTransform(final CandlepinQuery query) {
doAnswer(new Answer<CandlepinQuery>() {
@Override
public CandlepinQuery answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments();
return new TransformedCandlepinQuery(query, (ElementTransformer) args[0]);
}
}).when(query).transform(any(ElementTransformer.class));
}
@Test
public void getStatusesNoArgs() {
try {
jobResource.getStatuses(null, null, null);
fail("Should have thrown a BadRequestException");
}
catch (BadRequestException e) {
//expected, return
return;
}
}
@Test
public void schedulerPausedTest() throws PinsetterException {
when(pinsetterKernel.getSchedulerStatus()).thenReturn(true);
assertTrue(jobResource.getSchedulerStatus().isRunning());
when(pinsetterKernel.getSchedulerStatus()).thenReturn(false);
assertFalse(jobResource.getSchedulerStatus().isRunning());
}
@Test
public void getStatusAndDeleteIfFinishedTest() {
//nothing to delete..
when(jobCurator.find("bogus_id")).thenReturn(new JobStatus());
jobResource.getStatusAndDeleteIfFinished("foobar");
verify(jobCurator, never()).delete(any(JobStatus.class));
//now lets make a deletable JobStatus
JobStatus finishedJobStatus = new JobStatus();
finishedJobStatus.setState(JobState.FINISHED);
when(jobCurator.find("deletable_id")).thenReturn(finishedJobStatus);
jobResource.getStatusAndDeleteIfFinished("deletable_id");
verify(jobCurator, atLeastOnce()).delete(finishedJobStatus);
}
@Test
public void cancelJob() {
//we are just testing that the cancellation gets into the db
JobStatus createdJobStatus = new JobStatus();
createdJobStatus.setState(JobState.CREATED);
JobStatus canceledJobStatus = new JobStatus();
canceledJobStatus.setState(JobState.CANCELED);
when(jobCurator.find("cancel_id")).thenReturn(createdJobStatus);
when(jobCurator.cancel("cancel_id")).thenReturn(canceledJobStatus);
jobResource.cancel("cancel_id");
verify(jobCurator, atLeastOnce()).cancel("cancel_id");
}
@Test
public void getStatusesByPrincipal() {
List<JobStatus> statuses = new ArrayList<JobStatus>();
JobStatus status = new JobStatus();
statuses.add(status);
CandlepinQuery query = mock(CandlepinQuery.class);
when(query.list()).thenReturn(statuses);
when(query.iterate()).thenReturn(new MockResultIterator(statuses.iterator()));
when(query.iterate(anyInt(), anyBoolean())).thenReturn(new MockResultIterator(statuses.iterator()));
when(jobCurator.findByPrincipalName(eq("admin"))).thenReturn(query);
this.mockCPQueryTransform(query);
Collection<JobStatus> real = jobResource.getStatuses(null, null, "admin").list();
assertNotNull(real);
assertEquals(1, real.size());
}
@Test
public void getStatusesByOwner() {
List<JobStatus> statuses = new ArrayList<JobStatus>();
JobStatus status = new JobStatus();
statuses.add(status);
CandlepinQuery query = mock(CandlepinQuery.class);
when(query.list()).thenReturn(statuses);
when(query.iterate()).thenReturn(new MockResultIterator(statuses.iterator()));
when(query.iterate(anyInt(), anyBoolean())).thenReturn(new MockResultIterator(statuses.iterator()));
when(jobCurator.findByOwnerKey(eq("admin"))).thenReturn(query);
this.mockCPQueryTransform(query);
Collection<JobStatus> real = jobResource.getStatuses("admin", null, null).list();
assertNotNull(real);
assertEquals(1, real.size());
}
@Test
public void getStatusesByUuid() {
List<JobStatus> statuses = new ArrayList<JobStatus>();
JobStatus status = new JobStatus();
statuses.add(status);
CandlepinQuery query = mock(CandlepinQuery.class);
when(query.list()).thenReturn(statuses);
when(query.iterate()).thenReturn(new MockResultIterator(statuses.iterator()));
when(query.iterate(anyInt(), anyBoolean())).thenReturn(new MockResultIterator(statuses.iterator()));
when(jobCurator.findByConsumerUuid(eq("abcd"))).thenReturn(query);
this.mockCPQueryTransform(query);
Collection<JobStatus> real = jobResource.getStatuses(null, "abcd", null).list();
assertNotNull(real);
assertEquals(1, real.size());
}
@Test(expected = NotFoundException.class)
public void statusForPrincipalNotFound() {
when(jobCurator.findByPrincipalName(eq("foo"))).thenReturn(null);
jobResource.getStatuses(null, null, "foo");
}
@Test(expected = NotFoundException.class)
public void statusForOwnerNotFound() {
when(jobCurator.findByOwnerKey(eq("foo"))).thenReturn(null);
jobResource.getStatuses("foo", null, null);
}
@Test(expected = NotFoundException.class)
public void statusForConsumerNotFound() {
when(jobCurator.findByConsumerUuid(eq("foo"))).thenReturn(null);
jobResource.getStatuses(null, "foo", null);
}
@Test(expected = BadRequestException.class)
public void cannotSpecifyAllParams() {
jobResource.getStatuses("fi", "fi", "fofum");
}
@Test(expected = BadRequestException.class)
public void cannotSpecifyMoreThanOne() {
jobResource.getStatuses("fi", "fi", null);
}
@Test
public void emptyStringIsAlsoValid() {
List<JobStatus> statuses = new ArrayList<JobStatus>();
JobStatus status = new JobStatus();
statuses.add(status);
CandlepinQuery query = mock(CandlepinQuery.class);
when(query.list()).thenReturn(statuses);
when(jobCurator.findByPrincipalName(eq("foo"))).thenReturn(query);
jobResource.getStatuses(null, "", "foo");
}
/**
* Returns true if a BadRequestException was thrown, otherwise
* returns false.
* @param o param1
* @param c param2
* @param p param3
* @return true if a BadRequestException was thrown, otherwise
* returns false.
*/
private boolean expectException(String o, String c, String p) {
try {
jobResource.getStatuses(o, c, p);
}
catch (BadRequestException bre) {
return false;
}
return true;
}
@Test
public void verifyInput() {
List<JobStatus> statuses = new ArrayList<JobStatus>();
JobStatus status = new JobStatus();
statuses.add(status);
CandlepinQuery query = mock(CandlepinQuery.class);
when(query.list()).thenReturn(statuses);
when(jobCurator.findByOwnerKey(any(String.class))).thenReturn(query);
when(jobCurator.findByConsumerUuid(any(String.class))).thenReturn(query);
when(jobCurator.findByPrincipalName(any(String.class))).thenReturn(query);
assertFalse(expectException("owner", "uuid", "pname"));
assertFalse(expectException("owner", null, "pname"));
assertFalse(expectException("owner", "uuid", null));
assertFalse(expectException(null, "uuid", "pname"));
assertTrue(expectException("owner", null, null));
assertTrue(expectException("owner", "", null));
assertTrue(expectException(null, "uuid", null));
assertTrue(expectException("", "uuid", null));
assertTrue(expectException(null, null, "pname"));
assertTrue(expectException(null, "", "pname"));
}
}