package com.uber.jenkins.phabricator.coverage; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.WithoutJenkins; import org.xml.sax.SAXException; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Map; import javax.xml.parsers.ParserConfigurationException; import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import hudson.plugins.cobertura.CoberturaBuildAction; import hudson.plugins.cobertura.Ratio; import hudson.plugins.cobertura.targets.CoverageMetric; import hudson.plugins.cobertura.targets.CoverageResult; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class CoberturaCoverageProviderTest { private static final String TEST_COVERAGE_FILE = "go-torch-coverage.xml"; @Rule public JenkinsRule j = new JenkinsRule(); private CoberturaCoverageProvider provider; @WithoutJenkins @Before public void setUp() { provider = new CoberturaCoverageProvider(); } @WithoutJenkins @Test public void testConvertCobertura() { CoverageResult result = getMockResult(); CodeCoverageMetrics metrics = CoberturaCoverageProvider.convertCobertura(result); assertEquals(75.0f, metrics.getLineCoveragePercent(), 0.0f); assertEquals(0.0f, metrics.getPackageCoveragePercent(), 0.0f); } @WithoutJenkins @Test public void testConvertNullCobertura() { assertNull(CoberturaCoverageProvider.convertCobertura(null)); } @WithoutJenkins @Test public void testGetMetricsNullBuild() { assertNull(provider.getMetrics()); } @Test public void testGetMetricsNoResult() throws IOException { FreeStyleBuild build = getBuild(); provider.setBuild(build); assertNull(provider.getMetrics()); assertFalse(provider.hasCoverage()); } @Test public void testGetMetricsWithBuildActionResult() throws Exception { FreeStyleBuild build = getBuild(); build.addAction(CoberturaBuildAction.load( build, getMockResult(), null, null, false, false, false, false, false )); provider.setBuild(build); assertTrue(provider.hasCoverage()); CodeCoverageMetrics metrics = provider.getMetrics(); assertNotNull(metrics); assertEquals(75.0f, metrics.getLineCoveragePercent(), 0.0f); } @Test public void testGetMetricsWithoutBuildActionResult() throws Exception { FreeStyleBuild build = getBuild(); Path testCoverageFile = Paths.get(getClass().getResource(TEST_COVERAGE_FILE).toURI()); FileUtils.copyFile(testCoverageFile.toFile(), new File(build.getRootDir(), "coverage.xml")); provider.setBuild(build); assertTrue(provider.hasCoverage()); CodeCoverageMetrics metrics = provider.getMetrics(); assertNotNull(metrics); assertEquals(89.69697f, metrics.getLineCoveragePercent(), 0.0f); } @Test public void testGetMetricsWithoutBuildActionResultDeletesFilesFromMasterAfter() throws Exception { FreeStyleBuild build = getBuild(); Path testCoverageFile = Paths.get(getClass().getResource(TEST_COVERAGE_FILE).toURI()); File workspaceCopy = new File(build.getRootDir(), "coverage.xml"); FileUtils.copyFile(testCoverageFile.toFile(), workspaceCopy); provider.setBuild(build); assertTrue(provider.hasCoverage()); CodeCoverageMetrics metrics = provider.getMetrics(); assertNotNull(metrics); assertFalse(workspaceCopy.exists()); } @Test public void testGetLineCoverageNull() throws Exception { FreeStyleProject project = j.createFreeStyleProject(); FreeStyleBuild build = new FreeStyleBuild(project); provider.setBuild(build); assertNull(provider.readLineCoverage()); } @Test public void testGetLineCoverageWithFile() throws Exception { FreeStyleProject project = j.createFreeStyleProject(); FreeStyleBuild build = new FreeStyleBuild(project); File coverageFile = new File(build.getRootDir(), "coverage0.xml"); assertTrue(build.getRootDir().mkdirs()); InputStream in = getClass().getResourceAsStream("go-torch-coverage.xml"); OutputStream out = new BufferedOutputStream(new FileOutputStream(coverageFile)); IOUtils.copy(in, out); out.close(); provider.setBuild(build); Map<String, List<Integer>> coverage = provider.readLineCoverage(); assertNotNull(coverage); assertEquals(1, coverage.get("github.com/uber/go-torch/visualization/visualization.go").get(66).longValue()); } @Test public void testParseReportsIOException() throws Exception { CoberturaXMLParser parser = mock(CoberturaXMLParser.class); when(parser.parse(any(File.class))).thenThrow(IOException.class); assertNull(provider.parseReports(parser, new File[]{mock(File.class)})); } @Test public void testParseReportsParserException() throws Exception { CoberturaXMLParser parser = mock(CoberturaXMLParser.class); when(parser.parse(any(File.class))).thenThrow(ParserConfigurationException.class); assertNull(provider.parseReports(parser, new File[]{mock(File.class)})); } @Test public void testParseReportsSAXException() throws Exception { CoberturaXMLParser parser = mock(CoberturaXMLParser.class); when(parser.parse(any(File.class))).thenThrow(SAXException.class); assertNull(provider.parseReports(parser, new File[]{mock(File.class)})); } private CoverageResult getMockResult() { Ratio ratio = Ratio.create(75.0f, 100.0f); CoverageResult result = mock(CoverageResult.class); when(result.getCoverage(CoverageMetric.LINE)).thenReturn(ratio); return result; } private FreeStyleBuild getBuild() throws IOException { return new FreeStyleBuild(j.createFreeStyleProject()); } }