/* * Created on Aug 18, 2011 * Copyright 2010 by Eduard Weissmann (edi.weissmann@gmail.com). * * This file is part of the Sejda source code * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.sejda.cli; import static org.hamcrest.CoreMatchers.hasItem; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.sejda.model.exception.SejdaRuntimeException; import org.sejda.model.exception.TaskException; import org.sejda.model.input.PdfMergeInput; import org.sejda.model.input.PdfSource; import org.sejda.model.output.*; import org.sejda.model.parameter.AlternateMixMultipleInputParameters; import org.sejda.model.parameter.MergeParameters; import org.sejda.model.parameter.base.MultiplePdfSourceTaskParameters; import org.sejda.model.parameter.base.SinglePdfSourceTaskParameters; import org.sejda.model.parameter.base.TaskParameters; /** * Base class for test suites, provides helper methods to ease testing * * @author Eduard Weissmann * */ public abstract class AbstractTestSuite { public <T> void assertContains(T expectedItem, Collection<T> actualItems) { assertThat(actualItems, hasItem(expectedItem)); } public <T> void assertContainsAll(Collection<T> expectedItems, Collection<T> actualItems) { assertContainsAll("", expectedItems, actualItems); } public <T> void assertContainsAll(String message, Collection<T> expectedItems, Collection<T> actualItems) { for (T eachExpectedItem : expectedItems) { assertThat(message, actualItems, hasItem(eachExpectedItem)); } } protected File createTestPdfFile(String path) { return createTestFile(path, getClass().getResourceAsStream("/pdf/test_outline.pdf")); } protected File createTestEncryptedPdfFile(String path) { return createTestFile(path, getClass().getResourceAsStream("/pdf/test_outline.pdf")); } protected File createTestTextFile(String path, String contents) { return createTestFile(path, new ByteArrayInputStream(contents.getBytes())); } protected File overwriteTestPdfFile(String path, String resource) { return createTestFile(path, getClass().getResourceAsStream(resource)); } protected File createTestTextFile(String path, InputStream contents) { return createTestFile(path, contents); } protected File createTestFile(String path, InputStream contents) { File file = new File(path); file.deleteOnExit(); try { FileUtils.copyInputStreamToFile(contents, file); } catch (IOException e) { throw new SejdaRuntimeException("Can't create test file. Reason: " + e.getMessage(), e); } return file; } protected File createTestFolder(String path) { File file = new File(path); file.mkdirs(); file.deleteOnExit(); return file; } protected void assertHasFileSource(TaskParameters parameters, File file, String password) { if (parameters instanceof AlternateMixMultipleInputParameters) { assertHasFileSource((AlternateMixMultipleInputParameters) parameters, file, password); } else if (parameters instanceof MergeParameters) { assertHasFileSource((MergeParameters) parameters, file, password); } else if (parameters instanceof SinglePdfSourceTaskParameters) { assertHasFileSource((SinglePdfSourceTaskParameters) parameters, file, password); } else if (parameters instanceof MultiplePdfSourceTaskParameters) { assertHasFileSource((MultiplePdfSourceTaskParameters) parameters, file, password); } else { throw new SejdaRuntimeException("Cannot assert has file source: " + parameters); } } protected void assertHasFileSource(SinglePdfSourceTaskParameters parameters, File file, String password) { assertTrue("File '" + file + "'" + (StringUtils.isEmpty(password) ? " and no password" : " and password '" + password + "'"), matchesPdfFileSource(file, password, parameters.getSource())); } protected void assertHasFileSource(MergeParameters parameters, File file, String password) { List<PdfSource<?>> sourcesList = new ArrayList<PdfSource<?>>(); for (PdfMergeInput eachInput : parameters.getPdfInputList()) { sourcesList.add(eachInput.getSource()); } assertHasFileSource(sourcesList, file, password); } protected void assertHasFileSource(AlternateMixMultipleInputParameters parameters, File file, String password) { assertHasFileSource(Arrays.asList(parameters.getInputList().get(0).getSource(), parameters.getInputList().get(1).getSource()), file, password); } protected void assertHasFileSource(MultiplePdfSourceTaskParameters parameters, File file, String password) { assertHasFileSource(parameters.getSourceList(), file, password); } protected void assertHasFileSource(Collection<PdfSource<?>> parametersPdfSources, File file, String password) { boolean found = false; for (PdfSource<?> each : parametersPdfSources) { if (matchesPdfFileSource(file, password, each)) { found = true; } } assertTrue( "File '" + file + "'" + (StringUtils.isEmpty(password) ? " and no password" : " and password '" + password + "'"), found); } protected boolean matchesPdfFileSource(File file, String password, PdfSource<?> each) { return (each.getSource().equals(file) && StringUtils.equals(each.getPassword(), password)); } protected void assertOutputFolder(TaskParameters result, final Path expected) throws TaskException { result.getOutput().accept(new TaskOutputDispatcher() { @Override public void dispatch(DirectoryTaskOutput output) { assertEquals(expected.toAbsolutePath().normalize().toFile(), output.getDestination()); } @Override public void dispatch(FileTaskOutput output) { fail("wrong dispached method"); } @Override public void dispatch(FileOrDirectoryTaskOutput output) { assertEquals(expected.toAbsolutePath().normalize().toFile(), output.getDestination()); } }); } protected void assertOutputFile(TaskOutput output, final Path expected) throws TaskException { output.accept(new TaskOutputDispatcher() { @Override public void dispatch(DirectoryTaskOutput output) { fail("wrong dispached method"); } @Override public void dispatch(FileTaskOutput output) { assertEquals(expected.toAbsolutePath().normalize().toFile(), output.getDestination()); } @Override public void dispatch(FileOrDirectoryTaskOutput output) { assertEquals(expected.toAbsolutePath().normalize().toFile(), output.getDestination()); } }); } public static void assertConsoleOutputContains(String commandLine, String... expectedOutputContainedLines) { new CommandLineExecuteTestHelper(false).assertConsoleOutputContains(commandLine, expectedOutputContainedLines); } public static void assertTaskCompletes(String commandLine) { new CommandLineExecuteTestHelper(false).assertTaskCompletes(commandLine); } protected static <T> Set<T> asSet(T... items) { return new HashSet<T>(Arrays.asList(items)); } }