/*******************************************************************************
* Copyright (c) 2017 Synopsys, 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:
* Synopsys, Inc - initial implementation and documentation
*******************************************************************************/
package jenkins.plugins.coverity;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import jenkins.model.Jenkins;
import jenkins.plugins.coverity.CoverityPublisher.DescriptorImpl;
import jenkins.plugins.coverity.Utils.CoverityPublisherBuilder;
import jenkins.plugins.coverity.ws.TestWebServiceFactory;
import jenkins.plugins.coverity.ws.TestWebServiceFactory.TestConfigurationService;
import jenkins.plugins.coverity.ws.WebServiceFactory;
import net.sf.json.JSONObject;
@RunWith(PowerMockRunner.class)
@PrepareForTest({Jenkins.class, WebServiceFactory.class})
public class CoverityPublisherDescriptorImplTests {
private static final JSONObject PUBLISHER_FORM_OBJECT_JSON = JSONObject.fromObject("{\"name\":\"test-job\",\"publisher\":{\"kind\":\"jenkins.plugins.coverity.CoverityPublisher\",\"unstable\":false,\"hideChart\":false,\"invocationAssistance\":{\"buildArguments\":\"\",\"intermediateDir\":\"\",\"csharpMsvsca\":false,\"analyzeArguments\":\"\",\"saOverride\":\"\",\"commitArguments\":\"\",\"javaWarFile\":\"\"},\"keepIntDir\":false,\"cimStream\":{\"instance\":\"test-cim-instance\",\"id\":null,\"defectFilters\":{\"cutOffDate\":\"\"},\"project\":\"test-cim-project\",\"stream\":\"test-cim-stream\"},\"skipFetchingDefects\":false,\"failBuild\":false,\"stapler-class\":\"jenkins.plugins.coverity.CoverityPublisher\"},\"properties\":{\"hudson-model-ParametersDefinitionProperty\":{},\"stapler-class-bag\":\"true\"}}");
@Mock
private Jenkins jenkins;
private CIMInstance cimInstance;
@Before
public void setup() throws IOException {
// setup web service factory
final WebServiceFactory testWsFactory = new TestWebServiceFactory();
PowerMockito.mockStatic(WebServiceFactory.class);
when(WebServiceFactory.getInstance()).thenReturn(testWsFactory);
// setup jenkins
PowerMockito.mockStatic(Jenkins.class);
when(Jenkins.getInstance()).thenReturn(jenkins);
DescriptorImpl descriptor = mock(CoverityPublisher.DescriptorImpl.class);
cimInstance = new CIMInstance("test-cim-instance", "test-cim-instance", 8080, "admin", "password", false, 9080);
when(descriptor.getInstance(any(String.class))).thenReturn(cimInstance);
when(jenkins.getDescriptorOrDie(CoverityPublisher.class)).thenReturn(descriptor);
}
@Test
public void doLoadProjectsForInstance_returnsJsonReponse() throws ServletException, IOException, org.json.simple.parser.ParseException {
final String projectName = "test-cim-project";
final String streamName = "test-cim-stream";
CIMStream stream = new CIMStream("test-cim-instance", projectName, streamName, null);
TestConfigurationService testConfigurationService = (TestConfigurationService)WebServiceFactory.getInstance().getConfigurationService(cimInstance);
testConfigurationService.setupProjects(projectName, 2, streamName, 3);
CoverityPublisher publisher = new CoverityPublisherBuilder().withCimStream(stream).build();
DescriptorImpl descriptor = new CoverityPublisher.DescriptorImpl();
StaplerRequest request = mock(StaplerRequest.class);
when(request.getSubmittedForm()).thenReturn(PUBLISHER_FORM_OBJECT_JSON);
when(request.bindJSON(eq(CoverityPublisher.class), any(JSONObject.class))).thenReturn(publisher);
StaplerResponse response = mock(StaplerResponse.class);
final ByteArrayOutputStream testableStream = new ByteArrayOutputStream();
ServletOutputStream responseOutputStream = getServletOutputStream(testableStream);
try {
when(response.getOutputStream()).thenReturn(responseOutputStream);
descriptor.doLoadProjectsForInstance(request, response);
Mockito.verify(response).setContentType("application/json; charset=utf-8");
String responseOutput = new String(testableStream.toByteArray(), StandardCharsets.UTF_8);
assertEquals(
String.format("{\"projects\":[\"%1$s0\",\"%1$s1\",\"%1$s\"],\"selectedProject\":\"%1$s\",\"validSelection\":false}", projectName),
responseOutput);
} finally {
responseOutputStream.close();
}
}
@Test
public void doLoadStreamsForProject_returnsJsonResponse() throws ServletException, IOException, org.json.simple.parser.ParseException {
final String projectName = "test-cim-project";
final String streamName = "test-cim-stream";
CIMStream stream = new CIMStream("test-cim-instance", projectName + 1, streamName, null);
TestConfigurationService testConfigurationService = (TestConfigurationService)WebServiceFactory.getInstance().getConfigurationService(cimInstance);
testConfigurationService.setupProjects(projectName, 2, streamName, 3);
CoverityPublisher publisher = new CoverityPublisherBuilder().withCimStream(stream).build();
DescriptorImpl descriptor = new CoverityPublisher.DescriptorImpl();
StaplerRequest request = mock(StaplerRequest.class);
when(request.getSubmittedForm()).thenReturn(PUBLISHER_FORM_OBJECT_JSON);
when(request.bindJSON(eq(CoverityPublisher.class), any(JSONObject.class))).thenReturn(publisher);
StaplerResponse response = mock(StaplerResponse.class);
final ByteArrayOutputStream testableStream = new ByteArrayOutputStream();
ServletOutputStream responseOutputStream = getServletOutputStream(testableStream);
try {
when(response.getOutputStream()).thenReturn(responseOutputStream);
descriptor.doLoadStreamsForProject(request, response);
Mockito.verify(response).setContentType("application/json; charset=utf-8");
String responseOutput = new String(testableStream.toByteArray(), StandardCharsets.UTF_8);
assertEquals(
String.format("{\"streams\":[\"%1$s0\",\"%1$s1\",\"%1$s2\",\"%1$s\"],\"selectedStream\":\"%1$s\",\"validSelection\":false}", streamName),
responseOutput);
} finally {
responseOutputStream.close();
}
}
private ServletOutputStream getServletOutputStream(final ByteArrayOutputStream testableStream) {
return new ServletOutputStream() {
@Override
public boolean isReady() {
return true;
}
@Override
public void setWriteListener(WriteListener listener) {
}
@Override
public void write(int b) throws IOException {
testableStream.write(b);
}
};
}
}