blob: fed124ac0dc109096e91973b754d2889ab762f5f [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.tradefed.testtype;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.build.VersionedFile;
import com.android.tradefed.util.CommandResult;
import com.android.tradefed.util.CommandStatus;
import com.android.tradefed.util.FileUtil;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/** Unit tests for {@link JacocoCodeCoverageTest}. */
public class JacocoCodeCoverageTestTest {
private static final ImmutableCollection<File> executionFiles = ImmutableList
.of(new File("hello.exec"));
private IBuildInfo mockBuildInfo() {
IBuildInfo mockBuildInfo = mock(IBuildInfo.class);
when(mockBuildInfo.getFile("jacocoant.jar")).thenReturn(new File("jacocoant.jar"));
when(mockBuildInfo.getFiles())
.thenReturn(Arrays.asList(
new VersionedFile(new File("hello-allclasses.jar"), "1.0"),
new VersionedFile(new File("hi-allclasses.jar"), "1.0")));
return mockBuildInfo;
}
@Test
public void testGetReportFormat_noOptionSpecified() {
JacocoCodeCoverageTest jacocoCodeCoverageTest = new JacocoCodeCoverageTest();
List<JacocoCodeCoverageReportFormat> reportFormats = jacocoCodeCoverageTest
.getReportFormat();
assertEquals(ImmutableList.of(JacocoCodeCoverageReportFormat.HTML), reportFormats);
}
@Test
public void testGetReportFormat_optionsSpecified() {
JacocoCodeCoverageTest jacocoCodeCoverageTest = new JacocoCodeCoverageTest();
jacocoCodeCoverageTest.setReportFormat(Arrays.asList(JacocoCodeCoverageReportFormat.HTML,
JacocoCodeCoverageReportFormat.CSV, JacocoCodeCoverageReportFormat.XML));
List<JacocoCodeCoverageReportFormat> reportFormats = jacocoCodeCoverageTest
.getReportFormat();
assertEquals(
ImmutableList.of(JacocoCodeCoverageReportFormat.HTML,
JacocoCodeCoverageReportFormat.CSV, JacocoCodeCoverageReportFormat.XML),
reportFormats);
}
@Test
public void testGenerateCoverageReport_success() throws IOException {
IBuildInfo mockBuildInfo = mockBuildInfo();
File tempBuildXml = FileUtil.createTempFile("build", ".xml");
JacocoCodeCoverageTest jacocoCodeCoverageTest = spy(new JacocoCodeCoverageTest());
jacocoCodeCoverageTest.setClassFilesFilters(Arrays.asList(".*hello-allclasses.*\\.jar"));
jacocoCodeCoverageTest.setReportFormat(Arrays.asList(JacocoCodeCoverageReportFormat.HTML));
jacocoCodeCoverageTest.setJacocoAnt("jacocoant.jar");
CommandResult result = new CommandResult(CommandStatus.SUCCESS);
doReturn(result)
.when(jacocoCodeCoverageTest)
.runTimedCmd(anyLong(), any(String[].class));
doReturn(mockBuildInfo).when(jacocoCodeCoverageTest).getBuild();
doReturn(tempBuildXml).when(jacocoCodeCoverageTest).getBuildXml(eq(executionFiles),
eq(Arrays.asList(new File("hello-allclasses.jar"))), any(File.class),
eq(new File("jacocoant.jar")), eq(JacocoCodeCoverageReportFormat.HTML));
File reportDir = null;
long reportTimeout = jacocoCodeCoverageTest.getReportTimeout();
try {
reportDir = jacocoCodeCoverageTest.generateCoverageReport(executionFiles,
JacocoCodeCoverageReportFormat.HTML);
verify(jacocoCodeCoverageTest, times(1)).runTimedCmd(reportTimeout, new String[] {
"ant", "-verbose", "-f", tempBuildXml.getAbsolutePath()
});
assertNotNull(reportDir);
} finally {
FileUtil.recursiveDelete(reportDir);
FileUtil.deleteFile(tempBuildXml);
}
}
@Test
public void testGenerateCoverageReport_missingExecFiles() throws IOException {
JacocoCodeCoverageTest jacocoCodeCoverageTest = spy(new JacocoCodeCoverageTest());
String expectedStderr = "Could not find any exec file";
try {
jacocoCodeCoverageTest.generateCoverageReport(new ArrayList<>(),
JacocoCodeCoverageReportFormat.HTML);
fail("Should throw illegal argument exception in case of no exec files");
} catch (IllegalArgumentException e) {
// Test passes if generateCoverageReport throws IllegalArgumentException
assertTrue(e.getMessage().contains(expectedStderr));
}
}
@Test
public void testGenerateCoverageReport_missingClassFiles() {
IBuildInfo mockBuildInfo = mockBuildInfo();
JacocoCodeCoverageTest jacocoCodeCoverageTest = spy(new JacocoCodeCoverageTest());
jacocoCodeCoverageTest.setJacocoAnt("jacocoant.jar");
jacocoCodeCoverageTest.setClassFilesFilters(Arrays.asList(".*new-allclasses.*\\.jar"));
jacocoCodeCoverageTest.setReportFormat(Arrays.asList(JacocoCodeCoverageReportFormat.HTML));
doReturn(mockBuildInfo).when(jacocoCodeCoverageTest).getBuild();
String expectedStderr = "No class files found";
try {
jacocoCodeCoverageTest.generateCoverageReport(executionFiles,
JacocoCodeCoverageReportFormat.HTML);
fail("Should throw io exception in case class files are not found");
} catch (IOException e) {
// Test passes if generateCoverageReport throws IOException
assertTrue(e.getMessage().contains(expectedStderr));
}
}
@Test
public void testGenerateCoverageReport_unsuccessful() {
IBuildInfo mockBuildInfo = mockBuildInfo();
JacocoCodeCoverageTest jacocoCodeCoverageTest = spy(JacocoCodeCoverageTest.class);
jacocoCodeCoverageTest.setClassFilesFilters(Arrays.asList(".*hello-allclasses.*\\.jar"));
jacocoCodeCoverageTest.setJacocoAnt("jacocoant.jar");
String stderr = "something went wrong";
CommandResult fakeCommandResult = new CommandResult(CommandStatus.FAILED);
fakeCommandResult.setStderr(stderr);
doReturn(fakeCommandResult).when(jacocoCodeCoverageTest).runTimedCmd(anyLong(),
any(String[].class));
doReturn(mockBuildInfo).when(jacocoCodeCoverageTest).getBuild();
try {
jacocoCodeCoverageTest.generateCoverageReport(executionFiles,
JacocoCodeCoverageReportFormat.HTML);
fail("Should throw io exception in case ant command fails");
} catch (IOException e) {
// Test passes if generateCoverageReport throws IOException
assertTrue(e.getMessage().contains(stderr));
}
}
@Test
public void testGetFileTags() {
String actualExecFileset = new JacocoCodeCoverageTest().getFileTags(executionFiles);
String expectedExecFilesetString = "<file file=\""
+ new File("hello.exec").getAbsolutePath() + "\" />\n";
assertEquals(expectedExecFilesetString, actualExecFileset);
}
@Test
public void testGetBuildXml() throws IOException {
List<File> allclassesJars = Arrays.asList(new File("hello-allclasses.jar"),
new File("hi-allclasses.jar"));
JacocoCodeCoverageTest jacocoCodeCoverageTest = new JacocoCodeCoverageTest();
jacocoCodeCoverageTest.setReportFormat(Arrays.asList(JacocoCodeCoverageReportFormat.CSV));
File buildXml = jacocoCodeCoverageTest.getBuildXml(executionFiles, allclassesJars,
new File("report.xml"), new File("jacocoant.jar"),
JacocoCodeCoverageReportFormat.CSV);
String actualContent = FileUtil.readStringFromFile(buildXml);
StringBuilder expectedContent = new StringBuilder();
expectedContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
expectedContent.append("<project xmlns:jacoco=\"antlib:org.jacoco.ant\"\n");
expectedContent.append(
" name=\"Report generation using jacocoant\" default=\"generatereport\">\n");
expectedContent.append("\n");
expectedContent.append(" <taskdef uri=\"antlib:org.jacoco.ant\" ");
expectedContent.append("resource=\"org/jacoco/ant/antlib.xml\">\n");
expectedContent.append(" <classpath>\n");
expectedContent.append(" <pathelement path=\"");
expectedContent.append(new File("jacocoant.jar").getAbsolutePath());
expectedContent.append("\" />\n");
expectedContent.append(" </classpath>\n");
expectedContent.append(" </taskdef>\n");
expectedContent.append("\n");
expectedContent.append(" <target name=\"generatereport\">\n");
expectedContent.append("\n");
expectedContent.append(" <jacoco:report>\n");
expectedContent.append("\n");
expectedContent.append(" <executiondata>\n");
expectedContent.append(" <file file=\"");
expectedContent.append(new File("hello.exec").getAbsolutePath());
expectedContent.append("\" />\n");
expectedContent.append("\n");
expectedContent.append(" </executiondata>\n");
expectedContent.append("\n");
expectedContent.append(" <structure name=\"Jacoco ant\">\n");
expectedContent.append(" <classfiles>\n");
expectedContent.append(" <file file=\"");
expectedContent.append(new File("hello-allclasses.jar").getAbsolutePath());
expectedContent.append("\" />\n");
expectedContent.append("<file file=\"");
expectedContent.append(new File("hi-allclasses.jar").getAbsolutePath());
expectedContent.append("\" />\n");
expectedContent.append("\n");
expectedContent.append(" </classfiles>\n");
expectedContent.append(" </structure>\n");
expectedContent.append("\n");
expectedContent.append(" <csv destfile=\"");
expectedContent.append(new File("report.xml").getAbsolutePath());
expectedContent.append("\" />\n");
expectedContent.append("\n");
expectedContent.append(" </jacoco:report>\n");
expectedContent.append("\n");
expectedContent.append(" </target>\n");
expectedContent.append("\n");
expectedContent.append("</project>\n");
assertEquals(expectedContent.toString(), actualContent);
FileUtil.deleteFile(buildXml);
}
@Test
public void testIsClassFile_success() {
JacocoCodeCoverageTest jacocoCodeCoverageTest = new JacocoCodeCoverageTest();
jacocoCodeCoverageTest.setClassFilesFilters(
Arrays.asList(".*hello-allclasses.*\\.jar", ".*hi-allclasses.*\\.jar"));
boolean flag = jacocoCodeCoverageTest.isClassFile(
new File("foo/hello-allclasses_2456789.jar"));
assertEquals(true, flag);
}
@Test
public void testIsClassFile_fail() {
JacocoCodeCoverageTest jacocoCodeCoverageTest = new JacocoCodeCoverageTest();
jacocoCodeCoverageTest.setClassFilesFilters(
Arrays.asList(".*hello-allclasses.*\\.jar", ".*hi-allclasses.*\\.jar"));
boolean flag = jacocoCodeCoverageTest.isClassFile(
new File("foo/nomatch-allclasses_2456789.jar"));
assertEquals(false, flag);
}
}