/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.utils.common.xml.impl; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import java.util.List; import javax.xml.xpath.XPathExpressionException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.w3c.dom.Document; import de.rcenvironment.core.utils.common.FileUtils; import de.rcenvironment.core.utils.common.TempFileService; import de.rcenvironment.core.utils.common.TempFileServiceAccess; import de.rcenvironment.core.utils.common.xml.EMappingMode; import de.rcenvironment.core.utils.common.xml.XMLException; import de.rcenvironment.core.utils.common.xml.XMLMappingInformation; import de.rcenvironment.core.utils.common.xml.api.XMLSupportService; /** * Test for XML Mapper. Uses methods from XMLSupport for handling XML files. * * TODO Moved here for 6.2 because the class XMLException could not be moved due to serialization issues. Should be moved back to * core.utils.common in 7.0. * * @author Brigitte Boden * */ public class XMLMapperImplTest { private static final String CONTENT_OF_MAPPING_IS_NOT_AS_EXPECTED = "Content of mapping is not as expected."; private static final String CPACS_AREA_XPATH = "/cpacs/vehicles/aircraft/model/reference/area"; private static final String WRONG_TARGET_XPATH = "Wrong target xpath."; private static final String WRONG_SOURCE_XPATH = "Wrong source xpath."; private static final String WRONG_MAPPING_MODE = "Content should be 'MappingMode Delete'."; /** * JUnit Rule for expected exceptions. */ @Rule public ExpectedException thrown = ExpectedException.none(); private final Log log = LogFactory.getLog(getClass()); private XMLSupportService support; private XMLMapperServiceImpl xmlMapper; private File originCPACS; private File compareCPACS1; private File compareCPACS2; private File compareCPACSXSL; private File toolOutput; private File mappingInputSimple; private File mappingInputComplex; private File mappingOutput; private File xsltFile; private File resultFile; private TempFileService tempFileService; private File testRootDir; /** * Setup for the XML Mapper tests. * * @throws Exception on error. */ @Before public void setup() throws Exception { // Setup temp file service for testing TempFileServiceAccess.setupUnitTestEnvironment(); tempFileService = TempFileServiceAccess.getInstance(); testRootDir = tempFileService.createManagedTempDir(); log.debug("Testing in temporary directory " + testRootDir.getAbsolutePath()); xmlMapper = new XMLMapperServiceImpl(); support = new XMLSupportServiceImpl(); xmlMapper.bindXMLSupportService(support); originCPACS = new File("src/test/resources/CPACS.xml"); compareCPACS1 = new File("src/test/resources/compareCPACS_1.xml"); compareCPACS2 = new File("src/test/resources/compareCPACS_2.xml"); compareCPACSXSL = new File("src/test/resources/compareCPACS_xsl.xml"); toolOutput = new File("src/test/resources/toolOutput.xml"); mappingInputComplex = new File("src/test/resources/mappingInputDocLoop.xml"); mappingOutput = new File("src/test/resources/mappingOutputDoc.xml"); xsltFile = new File("src/test/resources/mappingInputRaw.xsl"); mappingInputSimple = new File("src/test/resources/mappingInput_newNamespace.xml"); resultFile = tempFileService.createTempFileFromPattern("output*.xml"); } /** * Clean up temp files. * * @throws IOException on Error. */ @After public void cleanup() throws IOException { tempFileService.disposeManagedTempDirOrFile(testRootDir); tempFileService.disposeManagedTempDirOrFile(resultFile); } /** * Test transforming a file with XSLT. * * @throws XMLException on Error. */ @Test public void testTransformXMLFileWithXSLT() throws XMLException { assertFalse(FileUtils.isLocked(originCPACS)); assertFalse(FileUtils.isLocked(resultFile)); assertFalse(FileUtils.isLocked(xsltFile)); xmlMapper.transformXMLFileWithXSLT(originCPACS, resultFile, xsltFile, null); assertFalse(FileUtils.isLocked(originCPACS)); assertFalse(FileUtils.isLocked(resultFile)); assertFalse(FileUtils.isLocked(xsltFile)); Document compareDoc = support.readXMLFromFile(compareCPACSXSL); Document target = support.readXMLFromFile(resultFile); target.normalizeDocument(); compareDoc.normalizeDocument(); assertTrue(CONTENT_OF_MAPPING_IS_NOT_AS_EXPECTED, support.writeXMLToString(target).equals(support.writeXMLToString(compareDoc))); } /** * Test if executing mapping is like expected (in a CPACS-manner). Problem with this Junit test: comparing XML is done via string. * However, sub-nodes are not defined in a special sequence. Therefore test may unsuccessful when order is not as expected. * * @throws XPathExpressionException Thrown if mapping fails. * @throws XMLException Error in XML handling * * @author Brigitte Boden * @author Markus Kunde (Code adapted from original class XMLMapperTest) * */ @Test public void testTransformXMLFileWithXMLMappingInformation() throws XMLException, XPathExpressionException { // like CPACS input mapping Document target = support.createDocument(); Document compareDoc = support.readXMLFromFile(compareCPACS1); compareDoc.normalizeDocument(); target.normalizeDocument(); xmlMapper.transformXMLFileWithXMLMappingInformation(support.readXMLFromFile(originCPACS), target, support.readXMLFromFile(mappingInputSimple)); assertTrue(CONTENT_OF_MAPPING_IS_NOT_AS_EXPECTED, support.writeXMLToString(target).equals(support.writeXMLToString(compareDoc))); // like CPACS output mapping target = support.readXMLFromFile(originCPACS); target.normalizeDocument(); xmlMapper.transformXMLFileWithXMLMappingInformation(support.readXMLFromFile(toolOutput), target, support.readXMLFromFile(mappingOutput)); compareDoc = support.readXMLFromFile(compareCPACS2); compareDoc.normalizeDocument(); assertTrue(CONTENT_OF_MAPPING_IS_NOT_AS_EXPECTED, support.writeXMLToString(target).equals(support.writeXMLToString(compareDoc))); } /** * Tests if the all involved files are not locked after calling transformXMLFileWithXMLMappingInformation. * * @throws XPathExpressionException Thrown if mapping fails. * @throws XMLException Error in XML handling * * @author Tobias Rodehutskors */ @Test public void testTransformXMLFileWithXMLMappingInformationForNotLocked() throws XPathExpressionException, XMLException { File target = new File(testRootDir, "target.xml"); xmlMapper.transformXMLFileWithXMLMappingInformation(toolOutput, target, mappingOutput); assertFalse(FileUtils.isLocked(toolOutput)); assertFalse(FileUtils.isLocked(target)); assertFalse(FileUtils.isLocked(mappingOutput)); } /** * Check handling of null values. They shouldn't cause uncatched NullPointerExceptions. XMLExceptions are expected. * * @throws XMLException on Error. * @throws XPathExpressionException on Error. */ @Test public void testWithNullValues() throws XMLException, XPathExpressionException { thrown.expect(XMLException.class); Document nullDoc = null; File nullFile = null; xmlMapper.transformXMLFileWithXMLMappingInformation(nullFile, nullFile, nullFile); xmlMapper.transformXMLFileWithXMLMappingInformation(originCPACS, nullFile, nullFile); xmlMapper.transformXMLFileWithXMLMappingInformation(nullFile, resultFile, nullFile); xmlMapper.transformXMLFileWithXMLMappingInformation(nullFile, nullFile, mappingInputSimple); xmlMapper.transformXMLFileWithXMLMappingInformation(nullFile, nullFile, nullDoc); xmlMapper.transformXMLFileWithXSLT(null, null, null, null); } /** * Test if correct mapping informations will be created. * * @throws Exception on error. * * @author Brigitte Boden * @author Markus Kunde (Code adapted from original class XMLMapperTest) * */ @Test public void testReadXMLMapping() throws Exception { List<XMLMappingInformation> inputSimple = xmlMapper.readXMLMapping(support.readXMLFromFile(mappingInputSimple)); List<XMLMappingInformation> inputComplex = xmlMapper.readXMLMapping(support.readXMLFromFile(mappingInputComplex)); List<XMLMappingInformation> output = xmlMapper.readXMLMapping(support.readXMLFromFile(mappingOutput)); // Validation of mapping information length assertTrue("Length of mapping information in simple input is not correct.", inputSimple.size() == 1); assertTrue("Length of mapping information in complex input is not correct.", inputComplex.size() == 4); assertTrue("Length of mapping information in output is not correct.", output.size() == 1); // Validation of mapping information content // inputSimple assertTrue(WRONG_MAPPING_MODE, inputSimple.get(0).getMode() == EMappingMode.Delete); assertTrue(WRONG_SOURCE_XPATH, inputSimple.get(0).getSourceXPath().equals(CPACS_AREA_XPATH)); assertTrue(WRONG_TARGET_XPATH, inputSimple.get(0).getTargetXPath().equals("/toolInput/data/var1")); // inputComplex assertTrue(WRONG_MAPPING_MODE, inputComplex.get(0).getMode() == EMappingMode.Delete); assertTrue(WRONG_SOURCE_XPATH, inputComplex.get(0).getSourceXPath().equals(CPACS_AREA_XPATH)); assertTrue(WRONG_TARGET_XPATH, inputComplex.get(0).getTargetXPath().equals("/toolInput/data/var1")); assertTrue(WRONG_MAPPING_MODE, inputComplex.get(1).getMode() == EMappingMode.Delete); assertTrue(WRONG_SOURCE_XPATH, inputComplex.get(1).getSourceXPath().equals("/cpacs/vehicles/aircraft/model/wings/wing[1]")); assertTrue(WRONG_TARGET_XPATH, inputComplex.get(1).getTargetXPath().equals("/toolInput/data/wing[1]")); assertTrue(WRONG_MAPPING_MODE, inputComplex.get(2).getMode() == EMappingMode.Delete); assertTrue(WRONG_SOURCE_XPATH, inputComplex.get(2).getSourceXPath().equals("/cpacs/vehicles/aircraft/model/wings/wing[2]")); assertTrue(WRONG_TARGET_XPATH, inputComplex.get(2).getTargetXPath().equals("/toolInput/data/wing[2]")); assertTrue(WRONG_MAPPING_MODE, inputComplex.get(3).getMode() == EMappingMode.Delete); assertTrue(WRONG_SOURCE_XPATH, inputComplex.get(3).getSourceXPath().equals("/cpacs/vehicles/aircraft/model/wings/wing[3]")); assertTrue(WRONG_TARGET_XPATH, inputComplex.get(3).getTargetXPath().equals("/toolInput/data/wing[3]")); // output assertTrue(WRONG_MAPPING_MODE, output.get(0).getMode() == EMappingMode.Delete); assertTrue(WRONG_SOURCE_XPATH, output.get(0).getSourceXPath().equals("/toolOutput/data/result1")); assertTrue(WRONG_TARGET_XPATH, output.get(0).getTargetXPath().equals(CPACS_AREA_XPATH)); } }