/*
* Copyright (C) 2015 Jan Pokorsky
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package cz.cas.lib.proarc.common.process;
import cz.cas.lib.proarc.common.CustomTemporaryFolder;
import cz.cas.lib.proarc.common.imports.InputUtils;
import cz.cas.lib.proarc.common.imports.TiffImporterTest;
import cz.cas.lib.proarc.common.process.GenericExternalProcess.ParamHandler;
import cz.cas.lib.proarc.common.process.GenericExternalProcess.ProcessResult;
import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.configuration.BaseConfiguration;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import org.junit.Assume;
import org.junit.Rule;
/**
*
* @author Jan Pokorsky
*/
public class GenericExternalProcessTest {
@Rule
public CustomTemporaryFolder temp = new CustomTemporaryFolder(true);
@BeforeClass
public static void setUpClass() {
}
@AfterClass
public static void tearDownClass() {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
@Test
public void testIMConvert() throws Exception {
// temp.setDeleteOnExit(false);
String imageMagicExec = "/usr/bin/convert";
Assume.assumeTrue(new File(imageMagicExec).exists());
File confFile = temp.newFile("props.cfg");
File root = temp.getRoot();
URL pdfaResource = TiffImporterTest.class.getResource("pdfa_test.pdf");
File pdfa = new File(root, "pdfa_test.pdf");
FileUtils.copyURLToFile(pdfaResource, pdfa);
FileUtils.writeLines(confFile, Arrays.asList(
"input.file.name=RESOLVED",
"exec=" + imageMagicExec,
// "arg=-verbose",
"arg=-thumbnail",
"arg=120x128",
"arg=$${input.file}[0]",
"arg=-flatten",
"arg=$${output.file}",
"id=test"
));
PropertiesConfiguration conf = new PropertiesConfiguration(confFile);
GenericExternalProcess gep = new GenericExternalProcess(conf);
gep.addInputFile(pdfa);
File output = new File(root, "pdfa.jpg");
gep.addOutputFile(output);
gep.run();
// System.out.printf("#exit: %s, out: %s\nresults: %s\n",
// gep.getExitCode(), gep.getFullOutput(), gep.getResultParameters());
assertEquals("exit code", 0, gep.getExitCode());
assertTrue(output.toString(), output.exists());
assertTrue("Not JPEG", InputUtils.isJpeg(output));
}
/** onExit is an experimental feature .*/
@Test
public void testIMConvertOnExit() throws Exception {
String imageMagicExec = "/usr/bin/convert";
Assume.assumeTrue(new File(imageMagicExec).exists());
File confFile = temp.newFile("props.cfg");
File root = temp.getRoot();
URL pdfaResource = TiffImporterTest.class.getResource("pdfa_test.pdf");
File pdfa = new File(root, "pdfa_test.pdf");
FileUtils.copyURLToFile(pdfaResource, pdfa);
FileUtils.writeLines(confFile, Arrays.asList(
"input.file.name=RESOLVED",
"exec=" + imageMagicExec,
"arg=-thumbnail",
"arg=120x128",
"arg=$${input.file}[0]",
"arg=-flatten",
"arg=$${input.folder}/$${input.file.name}.jpg",
"result.file=$${input.folder}/$${input.file.name}.jpg",
"onExits=0",
"onExit.0.param.output.file=$${input.folder}/$${input.file.name}.jpg",
"id=test"
));
PropertiesConfiguration conf = new PropertiesConfiguration(confFile);
GenericExternalProcess gep = new GenericExternalProcess(conf);
gep.addInputFile(pdfa);
gep.run();
// System.out.printf("#exit: %s, out: %s\nresults: %s\n",
// gep.getExitCode(), gep.getFullOutput(), gep.getResultParameters());
assertEquals("exit code", 0, gep.getExitCode());
File output = gep.getOutputFile();
assertNotNull(output);
assertTrue(output.toString(), output.exists());
assertTrue("Not JPEG", InputUtils.isJpeg(output));
}
@Test
public void testIMConvertFailure() throws Exception {
String imageMagicExec = "/usr/bin/convert";
Assume.assumeTrue(new File(imageMagicExec).exists());
File confFile = temp.newFile("props.cfg");
File root = temp.getRoot();
File pdfa = new File(root, "pdfa_test.pdf");
FileUtils.writeLines(confFile, Arrays.asList(
"input.file.name=RESOLVED",
"exec=" + imageMagicExec,
"arg=-thumbnail",
"arg=120x128",
"arg=$${input.file}[0]",
"arg=-flatten",
"arg=$${input.folder}/$${input.file.name}.jpg",
"onExits=0",
"onExit.0.param.output.file=$${input.folder}/$${input.file.name}.jpg",
"id=test"
));
PropertiesConfiguration conf = new PropertiesConfiguration(confFile);
GenericExternalProcess gep = new GenericExternalProcess(conf);
gep.addInputFile(pdfa);
gep.run();
// System.out.printf("#exit: %s, out: %s\nresults: %s\n",
// gep.getExitCode(), gep.getFullOutput(), gep.getResultParameters());
assertEquals("exit code", 1, gep.getExitCode());
String outputPath = gep.getResultParameters().get("test.param." + GenericExternalProcess.DST_PATH);
assertNull(outputPath);
}
@Test
public void testEscapePropertiesConfiguration() throws Exception {
File confFile = temp.newFile("props.cfg");
FileUtils.writeLines(confFile, Arrays.asList(
"input.file.name=RESOLVED",
"-1=ERR",
"*=ERR2",
"1-3=ERR3",
">1=ERR4",
"1,2,3=1\\,2\\,3",
"escape=-escape $${input.file.name}",
"resolve=-resolve ${input.file.name}[0]"
));
PropertiesConfiguration conf = new PropertiesConfiguration(confFile);
assertEquals("ERR", conf.getString("-1"));
assertEquals("ERR2", conf.getString("*"));
assertEquals("ERR3", conf.getString("1-3"));
assertEquals("ERR4", conf.getString(">1"));
assertEquals("1,2,3", conf.getString("1,2,3"));
assertEquals("-escape ${input.file.name}", conf.getString("escape"));
assertEquals("-resolve RESOLVED[0]", conf.getString("resolve"));
}
@Test
public void testGetResultParameters() throws Exception {
File confFile = temp.newFile("props.cfg");
FileUtils.writeLines(confFile, Arrays.asList(
"processor.test.param.mime=image/jpeg",
"processor.test.onExits=0, >10, 2\\,3, *",
"processor.test.onExit.0.param.file=ERR_0\\:$${input.file.name}",
"processor.test.onExit.>10.param.file=ERR_>10\\:$${input.file.name}",
"processor.test.onExit.>10.stop=false",
"processor.test.onExit.2,3.param.file=ERR_2\\,3\\:$${input.file.name}",
"processor.test.onExit.*.param.file=ERR_*\\:$${input.file.name}",
"processor.test.onSkip.param.file=SKIPPED\\:$${input.file.name}"
));
PropertiesConfiguration pconf = new PropertiesConfiguration(confFile);
String processorId = "processor.test";
Configuration conf = pconf.subset(processorId);
conf.setProperty("id", processorId);
GenericExternalProcess gep = new GenericExternalProcess(conf);
gep.addInputFile(confFile);
ProcessResult result = ProcessResult.getResultParameters(conf, gep.getParameters().getMap(), false, 0, null);
assertEquals("image/jpeg", result.getParameters().get(processorId + ".param.mime"));
assertEquals("ERR_0:props", result.getParameters().get(processorId + ".param.file"));
assertEquals(Integer.valueOf(0), result.getExit().getExitCode());
assertFalse(result.getExit().isStop());
assertFalse(result.getExit().isSkip());
result = ProcessResult.getResultParameters(conf, gep.getParameters().getMap(), false, 3, null);
assertEquals("image/jpeg", result.getParameters().get(processorId + ".param.mime"));
assertEquals("ERR_2,3:props", result.getParameters().get(processorId + ".param.file"));
assertEquals(Integer.valueOf(3), result.getExit().getExitCode());
assertTrue(result.getExit().isStop());
assertFalse(result.getExit().isSkip());
result = ProcessResult.getResultParameters(conf, gep.getParameters().getMap(), false, 11, null);
assertEquals("image/jpeg", result.getParameters().get(processorId + ".param.mime"));
assertEquals("ERR_>10:props", result.getParameters().get(processorId + ".param.file"));
assertEquals(Integer.valueOf(11), result.getExit().getExitCode());
assertFalse(result.getExit().isStop());
assertFalse(result.getExit().isSkip());
result = ProcessResult.getResultParameters(conf, gep.getParameters().getMap(), false, -1, null);
assertEquals("image/jpeg", result.getParameters().get(processorId + ".param.mime"));
assertEquals("ERR_*:props", result.getParameters().get(processorId + ".param.file"));
assertEquals(Integer.valueOf(-1), result.getExit().getExitCode());
assertTrue(result.getExit().isStop());
assertFalse(result.getExit().isSkip());
result = ProcessResult.getResultParameters(conf, gep.getParameters().getMap(), true, 0, null);
assertEquals("image/jpeg", result.getParameters().get(processorId + ".param.mime"));
assertEquals("SKIPPED:props", result.getParameters().get(processorId + ".param.file"));
assertFalse(result.getExit().isStop());
assertTrue(result.getExit().isSkip());
}
@Test
public void testAddInputFile() throws Exception {
final String inputName = "input.txt";
final File input = temp.newFile(inputName);
final BaseConfiguration conf = new BaseConfiguration();
conf.addProperty(ExternalProcess.PROP_EXEC, "test.sh");
conf.addProperty(ExternalProcess.PROP_ARG, "-i ${input.file.name}");
conf.addProperty(ExternalProcess.PROP_ARG, "-path ${input.file}[0]");
conf.addProperty(ExternalProcess.PROP_ARG, "-o ${input.folder}");
GenericExternalProcess gp = new GenericExternalProcess(conf).addInputFile(input);
assertEquals(gp.getParameters().getMap().get(GenericExternalProcess.SRC_NAME_EXT), input.getName());
assertEquals(gp.getParameters().getMap().get(GenericExternalProcess.SRC_PATH), input.getAbsolutePath());
assertEquals(gp.getParameters().getMap().get(GenericExternalProcess.SRC_PARENT), input.getParentFile().getAbsolutePath());
List<String> cmdLines = gp.buildCmdLine(conf);
// System.out.println(cmdLines.toString());
}
@Test
public void testInterpolateParameters() {
String testValue = "path=/${PATH1}/${PATH2}/${}";
ParamHandler paramHandler = new ParamHandler();
// no params
assertEquals(testValue, GenericExternalProcess.interpolateParameters(testValue, paramHandler.getMap()));
paramHandler.add("PATH1", "path1");
paramHandler.add("PATH2", "$2");
assertEquals("path=/path1/$2/${}", GenericExternalProcess.interpolateParameters(testValue, paramHandler.getMap()));
}
}