/*******************************************************************************
*
* Copyright (c) 2010-2011 Sonatype, Inc.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*
*
*
*
*******************************************************************************/
package org.hudsonci.service.internal;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import hudson.model.Item;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.Run;
import java.io.IOException;
import javax.servlet.ServletException;
import org.hudsonci.service.BuildNotFoundException;
import org.hudsonci.service.BuildService;
import org.hudsonci.service.ProjectService;
import org.hudsonci.service.SecurityService;
import org.hudsonci.service.ServiceRuntimeException;
import org.hudsonci.service.internal.BuildServiceImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class BuildServiceImplTest {
@Mock
private ProjectService projectService;
@Mock
private SecurityService securityService;
@Mock
private AbstractProject<?, ?> project;
@Mock
private AbstractBuild<?, ?> build;
private BuildService getInst() {
return new BuildServiceImpl(projectService, securityService);
}
@Test
public void getInstNotNull() {
assertNotNull(getInst());
}
@Test(expected = NullPointerException.class)
public void constructorNullArg1() {
new BuildServiceImpl(null, securityService);
}
@Test(expected = NullPointerException.class)
public void constructorNullArg2() {
new BuildServiceImpl(projectService, null);
}
// deleteBuild --------------
@Test(expected = NullPointerException.class)
public void deleteBuildNullProject() {
getInst().deleteBuild(null, 1);
}
@Test(expected = IllegalArgumentException.class)
public void deleteBuildNegativeBuildNumber() {
getInst().deleteBuild(project, -1);
}
@Test(expected = IllegalArgumentException.class)
public void deleteBuildZeroBuildNumber() {
getInst().deleteBuild(project, 0);
}
@Test
public void deleteBuildSecurity() throws IOException {
// spy so that we can call real methods
BuildService buildService = spy(getInst());
// partial mocking, using doReturn to avoid type safety <?,?> BS
doReturn(build).when(buildService).getBuild(project, 1);
// test
buildService.deleteBuild(project, 1);
// verify, security before operation
InOrder inOrder = inOrder(securityService, build);
inOrder.verify(securityService).checkPermission(build, Run.DELETE);
inOrder.verify(build).delete();
}
@Test(expected = ServiceRuntimeException.class)
public void deleteBuildServiceRuntimeException() throws IOException {
// spy so that we can call real methods
BuildService buildService = spy(getInst());
// partial mocking, using doReturn to avoid type safety <?,?> BS
doReturn(build).when(buildService).getBuild(project, 1);
doThrow(new IOException()).when(build).delete();
// test
buildService.deleteBuild(project, 1);
}
// keepBuild --------------
@Test(expected = NullPointerException.class)
public void keepBuildNullArg1() {
getInst().keepBuild(null, 1, true);
}
@Test(expected = IllegalArgumentException.class)
public void keepBuildNegativeBuildNumber() {
getInst().keepBuild(project, -1, true);
}
@Test(expected = IllegalArgumentException.class)
public void keepBuildZeroBuildNumber() {
getInst().keepBuild(project, 0, true);
}
@Test
public void keepBuildSecurity() throws IOException {
// spy so that we can call real methods
BuildService buildService = spy(getInst());
// partial mocking, using doReturn to avoid type safety <?,?> BS
doReturn(build).when(buildService).getBuild(project, 1);
// test
buildService.keepBuild(project, 1, true);
// verify, security before operation
InOrder inOrder = inOrder(securityService, build);
inOrder.verify(securityService).checkPermission(build, Run.UPDATE);
inOrder.verify(build).keepLog(false);
}
@Test(expected = ServiceRuntimeException.class)
public void keepBuildServiceRuntimeException() throws IOException {
// spy so that we can call real methods
BuildService buildService = spy(getInst());
// partial mocking, using doReturn to avoid type safety <?,?> BS
doReturn(build).when(buildService).getBuild(project, 1);
doThrow(new IOException()).when(build).keepLog(false);
// test
buildService.keepBuild(project, 1, true);
}
// getBuild(AbstractProject) -----------
@Test(expected = NullPointerException.class)
public void getBuildProjectNullProject() {
getInst().getBuild((AbstractProject<?, ?>) null, 1);
}
@Test(expected = IllegalArgumentException.class)
public void getBuildProjectBuildNumber() {
getInst().getBuild(project, -1);
}
@Test(expected = IllegalArgumentException.class)
public void getBuildProjectZeroBuildNumber() {
getInst().getBuild(project, 0);
}
@Test
public void getBuildByProjectSecurity() throws IOException {
// spy so that we can call real methods
BuildService buildService = spy(getInst());
// partial mocking
doReturn(build).when(project).getBuildByNumber(1);
// test
buildService.getBuild(project, 1);
// verify
verify(securityService).checkPermission(build, Item.READ);
}
@Test(expected = BuildNotFoundException.class)
public void getBuildByProjectBuildNotFoundException() throws IOException {
// spy so that we can call real methods
getInst().getBuild(project, 1);
}
// getBuild(projectName) -----------
@Test(expected = NullPointerException.class)
public void getBuildProjectNameNullName() {
getInst().getBuild((String) null, 1);
}
@Test(expected = IllegalArgumentException.class)
public void getBuildProjectNameNegativeBuildNumber() {
getInst().getBuild("projectName", -1);
}
@Test(expected = IllegalArgumentException.class)
public void getBuildProjectNameZeroBuildNumber() {
getInst().getBuild("projectName", 0);
}
@Test
public void getBuildByProjectNameSecurity() throws IOException {
// spy so that we can call real methods
BuildService buildService = spy(getInst());
// partial mocking
doReturn(build).when(project).getBuildByNumber(1);
doReturn(project).when(projectService).getProject("projectName");
// test
buildService.getBuild("projectName", 1);
// verify
verify(securityService).checkPermission(build, Item.READ);
}
@Test(expected = BuildNotFoundException.class)
public void getBuildByProjectNameBuildNotFoundException() throws IOException {
doReturn(project).when(projectService).getProject("projectName");
// spy so that we can call real methods
getInst().getBuild("projectName", 1);
}
// findBuildByProject ------
@Test(expected = NullPointerException.class)
public void findBuildByProjectNullProject() {
getInst().findBuild((AbstractProject<?, ?>) null, 1);
}
@Test(expected = IllegalArgumentException.class)
public void findBuildByProjectBuildNumber() {
getInst().findBuild(project, -1);
}
@Test(expected = IllegalArgumentException.class)
public void findBuildByProjectZeroBuildNumber() {
getInst().findBuild(project, 0);
}
@Test
public void findBuildByProjectSecurity() throws IOException {
// spy so that we can call real methods
BuildService buildService = spy(getInst());
// partial mocking
doReturn(build).when(project).getBuildByNumber(1);
// test
buildService.findBuild(project, 1);
// verify
verify(securityService).checkPermission(build, Item.READ);
}
@Test
public void findBuildByProjectReturnNull() {
assertNull(getInst().findBuild(project, 1));
}
// findBuildByProjectName -----
@Test(expected = NullPointerException.class)
public void findBuildProjectNameNullName() {
getInst().findBuild((String) null, 1);
}
@Test(expected = IllegalArgumentException.class)
public void findBuildProjectNameNegativeBuildNumber() {
getInst().findBuild("projectName", -1);
}
@Test(expected = IllegalArgumentException.class)
public void findBuildProjectNameZeroBuildNumber() {
getInst().findBuild("projectName", 0);
}
@Test
public void findBuildByProjectNameSecurity() throws IOException {
// spy so that we can call real methods
BuildService buildService = spy(getInst());
// partial mocking
doReturn(project).when(projectService).findProject("projectName");
doReturn(build).when(project).getBuildByNumber(1);
// test
buildService.findBuild("projectName", 1);
// verify
verify(securityService).checkPermission(build, Item.READ);
}
@Test
public void findBuildByProjectNameReturnNull() {
assertNull(getInst().findBuild("projectName", 1));
}
// stopBuild -------------
@Test(expected = NullPointerException.class)
public void stopBuildByProjectNameNullName() {
getInst().stopBuild(null, 1);
}
@Test(expected = IllegalArgumentException.class)
public void stopBuildByProjectNameNegativeBuildNumber() {
getInst().stopBuild(project, -1);
}
@Test(expected = IllegalArgumentException.class)
public void stopBuildProjectNameZeroBuildNumber() {
getInst().stopBuild(project, 0);
}
@Test
public void stopBuildSecurity(){
//intentionally blank as a note that security is performed internally in Hudson core.
}
@Test(expected = ServiceRuntimeException.class)
public void stopBuildServiceRuntimeException1() throws IOException {
BuildService inst = spy(getInst());
doReturn(build).when(inst).getBuild(project, 1);
try {
doThrow(new IOException()).when(build).doStop(any(StaplerRequest.class), any(StaplerResponse.class));
} catch (Exception e) {
fail(e.getMessage());
}
getInst().stopBuild(project, 1);
}
@Test(expected = ServiceRuntimeException.class)
public void stopBuildServiceRuntimeException2() throws IOException {
BuildService inst = spy(getInst());
doReturn(build).when(inst).getBuild(project, 1);
try {
doThrow(new ServletException()).when(build).doStop(any(StaplerRequest.class), any(StaplerResponse.class));
} catch (Exception e) {
fail(e.getMessage());
}
getInst().stopBuild(project, 1);
}
}