/* * Copyright (C) 2014-2015 Daniel Dietsch (dietsch@informatik.uni-freiburg.de) * Copyright (C) 2014-2015 Matthias Heizmann (heizmann@informatik.uni-freiburg.de) * Copyright (C) 2015 University of Freiburg * * This file is part of the ULTIMATE UnitTest Library. * * The ULTIMATE UnitTest Library 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 of the License, or * (at your option) any later version. * * The ULTIMATE UnitTest Library 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 General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the ULTIMATE UnitTest Library. If not, see . * * Additional permission under GNU GPL version 3 section 7: * If you modify the ULTIMATE UnitTest Library, or any covered work, by linking * or combining it with Eclipse RCP (or a modified version of Eclipse RCP), * containing parts covered by the terms of the Eclipse Public License, the * licensors of the ULTIMATE UnitTest Library grant you additional permission * to convey the resulting work. */ package de.uni_freiburg.informatik.ultimate.test; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.function.Supplier; import java.util.stream.Collectors; import org.junit.AfterClass; import org.junit.runner.RunWith; import de.uni_freiburg.informatik.ultimate.core.model.services.ILogger; import de.uni_freiburg.informatik.ultimate.test.decider.ITestResultDecider; import de.uni_freiburg.informatik.ultimate.test.junitextension.testfactory.FactoryTestRunner; import de.uni_freiburg.informatik.ultimate.test.junitextension.testfactory.TestFactory; import de.uni_freiburg.informatik.ultimate.test.mocks.ConsoleLogger; import de.uni_freiburg.informatik.ultimate.test.reporting.IIncrementalLog; import de.uni_freiburg.informatik.ultimate.test.reporting.INonIncrementalLog; import de.uni_freiburg.informatik.ultimate.test.reporting.IPreTestLog; import de.uni_freiburg.informatik.ultimate.test.reporting.ITestLogfile; import de.uni_freiburg.informatik.ultimate.test.reporting.ITestSummary; import de.uni_freiburg.informatik.ultimate.test.util.TestUtil; import de.uni_freiburg.informatik.ultimate.util.CoreUtil; /** * * @author dietsch@informatik.uni-freiburg.de * */ @RunWith(FactoryTestRunner.class) public abstract class UltimateTestSuite { private List mLogs; private ILogger mLogger; private Collection mTestCases; /** * Default constructor. */ public UltimateTestSuite() { mLogger = new ConsoleLogger(); mLogs = new ArrayList<>(); mLogs.addAll(sanitizeList(this::constructIncrementalLog)); mLogs.addAll(sanitizeList(this::constructTestSummaries)); mLogs.addAll(sanitizeList(this::constructPreTestLogs)); } private static List sanitizeList(final Supplier funSup) { final T[] elems = funSup.get(); if (elems == null || elems.length == 0) { return Collections.emptyList(); } return Arrays.asList(elems).stream().filter(Objects::nonNull).collect(Collectors.toList()); } protected abstract Collection createTestCases(); /** * Returns the {@link ITestSummary} instances that produce summaries while running the {@link UltimateTestSuite}. * This method is called only once during each run of an {@link UltimateTestSuite}. */ protected abstract ITestSummary[] constructTestSummaries(); protected abstract IIncrementalLog[] constructIncrementalLog(); protected IPreTestLog[] constructPreTestLogs() { return new IPreTestLog[0]; } protected UltimateTestCase buildTestCase(final UltimateRunDefinition urd, final ITestResultDecider decider) { return new UltimateTestCase(decider, urd, mLogs); } @TestFactory public Collection getTestCases() { if (mTestCases == null) { mTestCases = createTestCases(); writePrelogs(); } return mTestCases; } @AfterClass public final void afterTestSuite() { mLogger.info("Writing summaries"); mLogs.stream().filter(a -> a instanceof ITestSummary).map(a -> (ITestSummary) a) .forEach(this::writeNonIncrementalLog); mLogs = null; mTestCases = null; mLogger = null; } private final void writeNonIncrementalLog(final INonIncrementalLog nonIncrementalLog) { try { TestUtil.writeNonIncrementalLog(nonIncrementalLog, mLogger); } catch (final Throwable ex) { mLogger.fatal(String.format("There was an exception during the writing of a summary: %s%n%s%n%s", nonIncrementalLog.getClass(), ex, CoreUtil.getStackTrace(ex))); } } private void writePrelogs() { mLogger.info("Writing Prelogs"); final List prelogs = mLogs.stream().filter(a -> a instanceof IPreTestLog).map(a -> (IPreTestLog) a) .collect(Collectors.toList()); final List urds = mTestCases.stream().map(UltimateTestCase::getUltimateRunDefinition).collect(Collectors.toList()); for (final IPreTestLog preLog : prelogs) { preLog.addAllTests(urds); writeNonIncrementalLog(preLog); } mLogs.removeAll(prelogs); mLogger.info("Finished writing Prelogs"); } public ILogger getLogger() { return mLogger; } }