/** * Copyright (C) 2010-2017 Gordon Fraser, Andrea Arcuri and EvoSuite * contributors * * This file is part of EvoSuite. * * EvoSuite is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3.0 of the License, or * (at your option) any later version. * * EvoSuite is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with EvoSuite. If not, see <http://www.gnu.org/licenses/>. */ package org.evosuite.junit; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.Collections; import java.util.List; import org.apache.commons.io.FileUtils; import org.evosuite.EvoSuite; import org.evosuite.Properties; import org.evosuite.Properties.StatisticsBackend; import org.evosuite.SystemTestBase; import org.evosuite.continuous.persistency.CsvJUnitData; import org.evosuite.statistics.SearchStatistics; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.examples.with.different.packagename.Calculator; import com.examples.with.different.packagename.CalculatorTest; import com.examples.with.different.packagename.ClassNumberUtils; import com.examples.with.different.packagename.ClassNumberUtilsTest; import com.examples.with.different.packagename.ClassWithPrivateInterfaces; import com.examples.with.different.packagename.ClassWithPrivateInterfacesTest; import com.examples.with.different.packagename.FinalClass; import com.examples.with.different.packagename.FinalClassTest; import com.examples.with.different.packagename.StringUtils; import com.examples.with.different.packagename.StringUtilsEqualsIndexOfTest; import com.examples.with.different.packagename.WordUtils; import com.examples.with.different.packagename.WordUtilsTest; import com.examples.with.different.packagename.coverage.MethodWithSeveralInputArguments; import com.examples.with.different.packagename.coverage.TestMethodWithSeveralInputArguments; import com.opencsv.CSVReader; public class CoverageAnalysisOfProjectSystemTest extends SystemTestBase { private File classes_directory = null; private File tests_directory = null; @Before public void prepare() { try { FileUtils.deleteDirectory(new File("evosuite-report")); } catch (IOException e) { Assert.fail(e.getMessage()); } Properties.TARGET_CLASS = ""; Properties.OUTPUT_VARIABLES = null; Properties.STATISTICS_BACKEND = StatisticsBackend.DEBUG; Properties.COVERAGE_MATRIX = false; SearchStatistics.clearInstance(); CoverageAnalysis.reset(); } @After public void clean() { try { if (this.classes_directory != null && this.classes_directory.exists()) { FileUtils.deleteDirectory(this.classes_directory); } if (this.tests_directory != null && this.tests_directory.exists()) { FileUtils.deleteDirectory(this.tests_directory); } } catch (IOException e) { Assert.fail(e.getMessage()); } this.classes_directory = null; this.tests_directory = null; } @Test public void testMoreThanOneClassOneCriterion() throws IOException { createFakeProject(); EvoSuite evosuite = new EvoSuite(); Properties.CRITERION = new Properties.Criterion[] { Properties.Criterion.LINE }; Properties.STATISTICS_BACKEND = StatisticsBackend.CSV; String[] command = new String[] { "-target", this.classes_directory.getAbsolutePath(), "-Djunit=" + this.tests_directory.getAbsolutePath(), "-projectCP", this.classes_directory.getAbsolutePath() + File.pathSeparator + this.tests_directory.getAbsolutePath(), "-measureCoverage" }; SearchStatistics statistics = (SearchStatistics) evosuite.parseCommandLine(command); Assert.assertNotNull(statistics); String statistics_file = System.getProperty("user.dir") + File.separator + Properties.REPORT_DIR + File.separator + "statistics.csv"; CSVReader reader = new CSVReader(new FileReader(statistics_file)); List<String[]> rows = reader.readAll(); assertEquals(8, rows.size()); // header + 7 classes reader.close(); // assert TargetClasses List<String> classes = CsvJUnitData.getValues(rows, "TARGET_CLASS"); assertTrue(classes.contains(Calculator.class.getCanonicalName())); assertTrue(classes.contains(MethodWithSeveralInputArguments.class.getCanonicalName())); assertTrue(classes.contains(WordUtils.class.getCanonicalName())); assertTrue(classes.contains(FinalClass.class.getCanonicalName())); assertTrue(classes.contains(StringUtils.class.getCanonicalName())); assertTrue(classes.contains(ClassNumberUtils.class.getCanonicalName())); assertTrue(classes.contains(ClassWithPrivateInterfaces.class.getCanonicalName())); // assert Coverage List<String> coverages = CsvJUnitData.getValues(rows, "Coverage"); assertTrue(coverages.size() == 7); Collections.sort(coverages); assertEquals(0.80, Double.valueOf(coverages.get(0)), 0.01); assertEquals(0.80, Double.valueOf(coverages.get(1)), 0.00); assertEquals(0.90, Double.valueOf(coverages.get(2)), 0.00); assertEquals(0.93, Double.valueOf(coverages.get(3)), 0.01); assertEquals(0.95, Double.valueOf(coverages.get(4)), 0.00); assertEquals(1.00, Double.valueOf(coverages.get(5)), 0.00); assertEquals(1.00, Double.valueOf(coverages.get(6)), 0.00); } @Test public void testMoreThanOneClassMoreThanOneCriterion() throws IOException { createFakeProject(); EvoSuite evosuite = new EvoSuite(); Properties.CRITERION = new Properties.Criterion[] { Properties.Criterion.BRANCH, Properties.Criterion.LINE }; Properties.STATISTICS_BACKEND = StatisticsBackend.CSV; String[] command = new String[] { "-target", this.classes_directory.getAbsolutePath(), "-Djunit=" + this.tests_directory.getAbsolutePath(), "-projectCP", this.classes_directory.getAbsolutePath() + File.pathSeparator + this.tests_directory.getAbsolutePath(), "-measureCoverage" }; SearchStatistics statistics = (SearchStatistics) evosuite.parseCommandLine(command); Assert.assertNotNull(statistics); String statistics_file = System.getProperty("user.dir") + File.separator + Properties.REPORT_DIR + File.separator + "statistics.csv"; CSVReader reader = new CSVReader(new FileReader(statistics_file)); List<String[]> rows = reader.readAll(); assertTrue(rows.size() == 8); // header + 7 classes reader.close(); // assert TargetClasses List<String> classes = CsvJUnitData.getValues(rows, "TARGET_CLASS"); assertTrue(classes.contains(Calculator.class.getCanonicalName())); assertTrue(classes.contains(MethodWithSeveralInputArguments.class.getCanonicalName())); assertTrue(classes.contains(WordUtils.class.getCanonicalName())); assertTrue(classes.contains(FinalClass.class.getCanonicalName())); assertTrue(classes.contains(StringUtils.class.getCanonicalName())); assertTrue(classes.contains(ClassNumberUtils.class.getCanonicalName())); assertTrue(classes.contains(ClassWithPrivateInterfaces.class.getCanonicalName())); // assert Coverage List<String> coverages = CsvJUnitData.getValues(rows, "Coverage"); assertTrue(coverages.size() == 7); Collections.sort(coverages); // assertEquals(0.45, Double.valueOf(coverages.get(0)), 0.01); // assertEquals(0.47, Double.valueOf(coverages.get(1)), 0.01); // assertEquals(0.52, Double.valueOf(coverages.get(2)), 0.01); // assertEquals(0.58, Double.valueOf(coverages.get(3)), 0.02); // assertEquals(0.88, Double.valueOf(coverages.get(4)), 0.01); // assertEquals(1.00, Double.valueOf(coverages.get(5)), 0.00); // assertEquals(1.00, Double.valueOf(coverages.get(6)), 0.00); assertTrue(Double.valueOf(coverages.get(0)) > 0.0); assertTrue(Double.valueOf(coverages.get(1)) > 0.0); assertTrue(Double.valueOf(coverages.get(2)) > 0.0); assertTrue(Double.valueOf(coverages.get(3)) > 0.0); assertTrue(Double.valueOf(coverages.get(4)) > 0.0); assertTrue(Double.valueOf(coverages.get(5)) > 0.0); assertTrue(Double.valueOf(coverages.get(6)) > 0.0); } private void createFakeProject() throws IOException { String classesRootDir = System.getProperty("user.dir") + File.separator + "target" + File.separator + "test-classes" + File.separator; this.classes_directory = Files.createTempDirectory("fakeProject_classes_").toFile(); this.classes_directory.mkdir(); this.tests_directory = Files.createTempDirectory("fakeProject_tests_").toFile(); this.tests_directory.mkdir(); // copy some classes copyClassFile(classesRootDir, this.classes_directory.getAbsolutePath(), Calculator.class); copyClassFile(classesRootDir, this.tests_directory.getAbsolutePath(), CalculatorTest.class); copyClassFile(classesRootDir, this.classes_directory.getAbsolutePath(), MethodWithSeveralInputArguments.class); copyClassFile(classesRootDir, this.tests_directory.getAbsolutePath(), TestMethodWithSeveralInputArguments.class); copyClassFile(classesRootDir, this.classes_directory.getAbsolutePath(), WordUtils.class); copyClassFile(classesRootDir, this.tests_directory.getAbsolutePath(), WordUtilsTest.class); copyClassFile(classesRootDir, this.classes_directory.getAbsolutePath(), FinalClass.class); copyClassFile(classesRootDir, this.tests_directory.getAbsolutePath(), FinalClassTest.class); copyClassFile(classesRootDir, this.classes_directory.getAbsolutePath(), StringUtils.class); copyClassFile(classesRootDir, this.tests_directory.getAbsolutePath(), StringUtilsEqualsIndexOfTest.class); copyClassFile(classesRootDir, this.classes_directory.getAbsolutePath(), ClassNumberUtils.class); copyClassFile(classesRootDir, this.tests_directory.getAbsolutePath(), ClassNumberUtilsTest.class); copyClassFile(classesRootDir, this.classes_directory.getAbsolutePath(), ClassWithPrivateInterfaces.class); copyClassFile(classesRootDir, this.tests_directory.getAbsolutePath(), ClassWithPrivateInterfacesTest.class); } private void copyClassFile(String root, String tmp, Class<?> clazz) throws IOException { // create structure new File(tmp, clazz.getPackage().getName().replace(".", File.separator)).mkdirs(); // copy .class file Files.copy(Paths.get(root + clazz.getCanonicalName().replace(".", File.separator) + ".class"), Paths.get(tmp + File.separator + clazz.getCanonicalName().replace(".", File.separator) + ".class"), StandardCopyOption.COPY_ATTRIBUTES); } }