From 255c829b598a7a3151489e7121c56b219e530777 Mon Sep 17 00:00:00 2001 From: Manuel Bentele Date: Fri, 4 Feb 2022 12:19:44 +0100 Subject: Force Unix line endings for Libvirt XML files (even on Windows platforms) --- pom.xml | 12 ++++ .../openslx/libvirt/xml/LibvirtXmlDocument.java | 3 +- .../VirtualizationConfigurationQemu.java | 2 +- .../libvirt/xsl/xml-output-transformation.xsl | 8 ++- .../libvirt/xml/LibvirtXmlDocumentTest.java | 29 +++++++-- .../VirtualizationConfigurationQemuTest.java | 5 +- ...urationLogicDozModClientToDozModServerTest.java | 6 +- ...urationLogicDozModServerToDozModClientTest.java | 7 +-- ...tionLogicDozModServerToStatelessClientTest.java | 7 +-- .../logic/ConfigurationLogicTestUtils.java | 71 ++++++++++++++-------- ..._default-ubuntu-20-04-vm_transform-editable.xml | 8 +-- ...rtualbox_default-ubuntu_transform-editable.vbox | 10 +-- 12 files changed, 113 insertions(+), 55 deletions(-) diff --git a/pom.xml b/pom.xml index f79b378..70898af 100644 --- a/pom.xml +++ b/pom.xml @@ -164,6 +164,18 @@ [5.0,6.0) test + + org.xmlunit + xmlunit-core + [2.0,3.0) + test + + + org.xmlunit + xmlunit-assertj + [2.0,3.0) + test + org.apache.logging.log4j log4j-api diff --git a/src/main/java/org/openslx/libvirt/xml/LibvirtXmlDocument.java b/src/main/java/org/openslx/libvirt/xml/LibvirtXmlDocument.java index f24ba4f..97180e3 100644 --- a/src/main/java/org/openslx/libvirt/xml/LibvirtXmlDocument.java +++ b/src/main/java/org/openslx/libvirt/xml/LibvirtXmlDocument.java @@ -312,7 +312,7 @@ public abstract class LibvirtXmlDocument implements LibvirtXmlSerializable, Libv DOMSource source = new DOMSource( this.xmlDocument ); StreamResult xmlString = new StreamResult( xmlWriter ); this.xmlTransformer.transform( source, xmlString ); - xml = xmlWriter.toString() + System.lineSeparator(); + xml = xmlWriter.toString(); xmlWriter.close(); } catch ( TransformerException | IOException e ) { throw new LibvirtXmlSerializationException( e.getLocalizedMessage() ); @@ -337,7 +337,6 @@ public abstract class LibvirtXmlDocument implements LibvirtXmlSerializable, Libv DOMSource source = new DOMSource( this.xmlDocument ); StreamResult xmlStream = new StreamResult( xmlWriter ); this.xmlTransformer.transform( source, xmlStream ); - xmlWriter.append( System.lineSeparator() ); xmlWriter.close(); } catch ( TransformerException | IOException e ) { throw new LibvirtXmlSerializationException( e.getLocalizedMessage() ); diff --git a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java index ced9160..7082e27 100644 --- a/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java +++ b/src/main/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemu.java @@ -746,7 +746,7 @@ public class VirtualizationConfigurationQemu extends VirtualizationConfiguration return null; } else { // append newline at the end of the XML content to match the structure of an original Libvirt XML file - configuration += System.lineSeparator(); + //configuration += LibvirtXmlDocument.LINE_SEPARATOR; return configuration.getBytes( StandardCharsets.UTF_8 ); } } diff --git a/src/main/resources/libvirt/xsl/xml-output-transformation.xsl b/src/main/resources/libvirt/xsl/xml-output-transformation.xsl index febed54..8cd615d 100644 --- a/src/main/resources/libvirt/xsl/xml-output-transformation.xsl +++ b/src/main/resources/libvirt/xsl/xml-output-transformation.xsl @@ -2,11 +2,17 @@ xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xalan"> + encoding="UTF-8" indent="yes" xalan:indent-amount="2" + xalan:line-separator=" " /> + + + + + diff --git a/src/test/java/org/openslx/libvirt/xml/LibvirtXmlDocumentTest.java b/src/test/java/org/openslx/libvirt/xml/LibvirtXmlDocumentTest.java index 02c8b19..15d203c 100644 --- a/src/test/java/org/openslx/libvirt/xml/LibvirtXmlDocumentTest.java +++ b/src/test/java/org/openslx/libvirt/xml/LibvirtXmlDocumentTest.java @@ -7,9 +7,13 @@ import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.fail; +import java.io.BufferedReader; import java.io.File; +import java.io.FileReader; import java.io.IOException; import java.io.InputStream; +import java.io.Reader; +import java.io.StringReader; import java.nio.charset.StandardCharsets; import org.apache.commons.io.FileUtils; @@ -78,6 +82,22 @@ public class LibvirtXmlDocumentTest return document; } + private static long countLines( Reader input ) throws IOException + { + final BufferedReader bfrContent = new BufferedReader( input ); + return bfrContent.lines().count(); + } + + public static long countLinesFromString( String input ) throws IOException + { + return LibvirtXmlDocumentTest.countLines( new StringReader( input ) ); + } + + public static long countLinesFromFile( File input ) throws IOException + { + return LibvirtXmlDocumentTest.countLines( new FileReader( input ) ); + } + @Test @DisplayName( "Read libvirt XML file to String" ) public void testReadXmlFileToString() throws LibvirtXmlSerializationException, IOException @@ -86,12 +106,11 @@ public class LibvirtXmlDocumentTest File originalXmlFile = LibvirtXmlTestResources.getLibvirtXmlFile( "qemu-kvm_default-ubuntu-20-04-vm.xml" ); final String readXmlContent = vm.toXml(); - final String originalXmlContent = FileUtils.readFileToString( originalXmlFile, StandardCharsets.UTF_8 ); assertNotNull( readXmlContent ); - final int lengthReadXmlContent = readXmlContent.split( System.lineSeparator() ).length; - final int lengthOriginalXmlContent = originalXmlContent.split( System.lineSeparator() ).length; + final long lengthReadXmlContent = LibvirtXmlDocumentTest.countLinesFromString( readXmlContent ); + final long lengthOriginalXmlContent = LibvirtXmlDocumentTest.countLinesFromFile( originalXmlFile ); assertEquals( lengthOriginalXmlContent, lengthReadXmlContent ); } @@ -111,8 +130,8 @@ public class LibvirtXmlDocumentTest assertNotNull( readXmlContent ); - final int lengthReadXmlContent = readXmlContent.split( System.lineSeparator() ).length; - final int lengthOriginalXmlContent = originalXmlContent.split( System.lineSeparator() ).length; + final long lengthReadXmlContent = LibvirtXmlDocumentTest.countLinesFromString( readXmlContent ); + final long lengthOriginalXmlContent = LibvirtXmlDocumentTest.countLinesFromString( originalXmlContent ); assertEquals( lengthOriginalXmlContent, lengthReadXmlContent ); } diff --git a/src/test/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuTest.java b/src/test/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuTest.java index 4b07adc..f8347f4 100644 --- a/src/test/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuTest.java +++ b/src/test/java/org/openslx/virtualization/configuration/VirtualizationConfigurationQemuTest.java @@ -31,6 +31,7 @@ import org.openslx.libvirt.domain.device.DiskCdrom; import org.openslx.libvirt.domain.device.DiskFloppy; import org.openslx.libvirt.domain.device.DiskStorage; import org.openslx.libvirt.domain.device.Interface; +import org.openslx.libvirt.xml.LibvirtXmlDocumentTest; import org.openslx.libvirt.xml.LibvirtXmlTestResources; import org.openslx.virtualization.Version; import org.openslx.virtualization.configuration.VirtualizationConfiguration.ConfigurableOptionGroup; @@ -179,8 +180,8 @@ public class VirtualizationConfigurationQemuTest assertNotNull( unfilteredXmlConfig ); - final int lengthUnfilteredXmlConfig = unfilteredXmlConfig.split( System.lineSeparator() ).length; - final int lengthOriginalXmlConfig = originalXmlConfig.split( System.lineSeparator() ).length; + final long lengthUnfilteredXmlConfig = LibvirtXmlDocumentTest.countLinesFromString( unfilteredXmlConfig ); + final long lengthOriginalXmlConfig = LibvirtXmlDocumentTest.countLinesFromString( originalXmlConfig ); assertEquals( lengthOriginalXmlConfig, lengthUnfilteredXmlConfig ); diff --git a/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModClientToDozModServerTest.java b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModClientToDozModServerTest.java index 0c164c6..09de9f5 100644 --- a/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModClientToDozModServerTest.java +++ b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModClientToDozModServerTest.java @@ -41,7 +41,7 @@ public class ConfigurationLogicDozModClientToDozModServerTest final String transformedConfig = config.getConfigurationAsString(); final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); - assertTrue( ConfigurationLogicTestUtils.isContentEqual( expectedTransformedConfig, transformedConfig ) ); + ConfigurationLogicTestUtils.assertXmlEqual( expectedTransformedConfig, transformedConfig ); assertDoesNotThrow( () -> config.validate() ); } @@ -62,7 +62,7 @@ public class ConfigurationLogicDozModClientToDozModServerTest final String transformedConfig = config.getConfigurationAsString(); final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); - assertTrue( ConfigurationLogicTestUtils.isContentEqual( expectedTransformedConfig, transformedConfig ) ); + ConfigurationLogicTestUtils.assertXmlEqual( expectedTransformedConfig, transformedConfig ); // do not validate the VirtualBox configuration afterwards, since the inserted // place holders do not match valid primitive values from the XML schema @@ -87,7 +87,7 @@ public class ConfigurationLogicDozModClientToDozModServerTest final String transformedConfig = config.getConfigurationAsString(); final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); - assertTrue( ConfigurationLogicTestUtils.isContentEqual( expectedTransformedConfig, transformedConfig ) ); + ConfigurationLogicTestUtils.assertVmxVmwareEqual( expectedTransformedConfig, transformedConfig ); assertDoesNotThrow( () -> config.validate() ); } } diff --git a/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClientTest.java b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClientTest.java index 4e49eab..772f2f4 100644 --- a/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClientTest.java +++ b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToDozModClientTest.java @@ -56,7 +56,7 @@ public class ConfigurationLogicDozModServerToDozModClientTest final String transformedConfig = config.getConfigurationAsString(); final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); - assertTrue( ConfigurationLogicTestUtils.isLibvirtContentEqual( expectedTransformedConfig, transformedConfig ) ); + ConfigurationLogicTestUtils.assertXmlLibvirtEqual( expectedTransformedConfig, transformedConfig ); assertDoesNotThrow( () -> config.validate() ); } @@ -77,8 +77,7 @@ public class ConfigurationLogicDozModServerToDozModClientTest final String transformedConfig = config.getConfigurationAsString(); final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); - assertTrue( - ConfigurationLogicTestUtils.isVirtualBoxContentEqual( expectedTransformedConfig, transformedConfig ) ); + ConfigurationLogicTestUtils.assertXmlVirtualBoxEqual( expectedTransformedConfig, transformedConfig ); // do not validate the VirtualBox configuration afterwards, since the inserted network configuration // leads to an invalid DOM although the created output after the transformation is as expected @@ -103,7 +102,7 @@ public class ConfigurationLogicDozModServerToDozModClientTest final String transformedConfig = config.getConfigurationAsString(); final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); - assertTrue( ConfigurationLogicTestUtils.isContentEqual( expectedTransformedConfig, transformedConfig ) ); + ConfigurationLogicTestUtils.assertVmxVmwareEqual( expectedTransformedConfig, transformedConfig ); assertDoesNotThrow( () -> config.validate() ); } } diff --git a/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClientTest.java b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClientTest.java index 7380277..2271e9c 100644 --- a/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClientTest.java +++ b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicDozModServerToStatelessClientTest.java @@ -50,7 +50,7 @@ public class ConfigurationLogicDozModServerToStatelessClientTest final String transformedConfig = config.getConfigurationAsString(); final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); - assertTrue( ConfigurationLogicTestUtils.isContentEqual( expectedTransformedConfig, transformedConfig ) ); + ConfigurationLogicTestUtils.assertXmlEqual( expectedTransformedConfig, transformedConfig ); assertDoesNotThrow( () -> config.validate() ); } @@ -71,8 +71,7 @@ public class ConfigurationLogicDozModServerToStatelessClientTest final String transformedConfig = config.getConfigurationAsString(); final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); - assertTrue( - ConfigurationLogicTestUtils.isVirtualBoxContentEqual( expectedTransformedConfig, transformedConfig ) ); + ConfigurationLogicTestUtils.assertXmlVirtualBoxEqual( expectedTransformedConfig, transformedConfig ); // do not validate the VirtualBox configuration afterwards, since the inserted // place holders do not match valid primitive values from the XML schema @@ -97,7 +96,7 @@ public class ConfigurationLogicDozModServerToStatelessClientTest final String transformedConfig = config.getConfigurationAsString(); final String expectedTransformedConfig = ConfigurationLogicTestUtils.readFileToString( expectedConfig ); - assertTrue( ConfigurationLogicTestUtils.isContentEqual( expectedTransformedConfig, transformedConfig ) ); + ConfigurationLogicTestUtils.assertVmxVmwareEqual( expectedTransformedConfig, transformedConfig ); assertDoesNotThrow( () -> config.validate() ); } } diff --git a/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicTestUtils.java b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicTestUtils.java index 1159d74..4f82097 100644 --- a/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicTestUtils.java +++ b/src/test/java/org/openslx/virtualization/configuration/logic/ConfigurationLogicTestUtils.java @@ -1,5 +1,6 @@ package org.openslx.virtualization.configuration.logic; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; import java.io.BufferedReader; @@ -7,6 +8,7 @@ import java.io.File; import java.io.IOException; import java.io.StringReader; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -17,6 +19,7 @@ import java.util.stream.Collectors; import org.apache.commons.io.FileUtils; import org.openslx.bwlp.thrift.iface.OperatingSystem; import org.openslx.virtualization.configuration.VirtualizationConfiguration; +import org.xmlunit.assertj.XmlAssert; public class ConfigurationLogicTestUtils { @@ -68,23 +71,9 @@ public class ConfigurationLogicTestUtils return content; } - public static boolean isContentEqual( String expectedContent, String actualContent ) + public static void assertXmlEqual( String expectedXml, String actualXml ) throws AssertionError { - final BufferedReader bfrContent1 = new BufferedReader( new StringReader( expectedContent ) ); - final BufferedReader bfrContent2 = new BufferedReader( new StringReader( actualContent ) ); - final List linesContent1 = bfrContent1.lines().collect( Collectors.toList() ); - final List linesContent2 = bfrContent2.lines().collect( Collectors.toList() ); - - Collections.sort( linesContent1 ); - Collections.sort( linesContent2 ); - - boolean ret = linesContent1.equals( linesContent2 ); - if ( !ret ) { - System.out.println( "----- UNEXPECTED OUTPUT: -------------\n" ); - System.out.println( actualContent ); - System.out.println( "--------------------------------------\n" ); - } - return ret; + XmlAssert.assertThat( expectedXml ).and( actualXml ).ignoreComments().areIdentical(); } public static String removeSourceFilePaths( String content ) @@ -105,21 +94,55 @@ public class ConfigurationLogicTestUtils return matcherUuidContent.replaceAll( "" ); } - public static boolean isLibvirtContentEqual( String content1, String content2 ) + public static void assertXmlLibvirtEqual( String expectedXml, String actualXml ) throws AssertionError { // replace all source file paths with the empty String - final String filteredContent1 = ConfigurationLogicTestUtils.removeSourceFilePaths( content1 ); - final String filteredContent2 = ConfigurationLogicTestUtils.removeSourceFilePaths( content2 ); + final String filteredXml1 = ConfigurationLogicTestUtils.removeSourceFilePaths( expectedXml ); + final String filteredXml2 = ConfigurationLogicTestUtils.removeSourceFilePaths( actualXml ); - return ConfigurationLogicTestUtils.isContentEqual( filteredContent1, filteredContent2 ); + ConfigurationLogicTestUtils.assertXmlEqual( filteredXml1, filteredXml2 ); } - public static boolean isVirtualBoxContentEqual( String content1, String content2 ) + public static void assertXmlVirtualBoxEqual( String expectedXml, String actualXml ) throws AssertionError { // replace all UUIDs with the empty String - final String filteredContent1 = ConfigurationLogicTestUtils.removeUuid( content1 ); - final String filteredContent2 = ConfigurationLogicTestUtils.removeUuid( content2 ); + final String filteredXml1 = ConfigurationLogicTestUtils.removeUuid( expectedXml ); + final String filteredXml2 = ConfigurationLogicTestUtils.removeUuid( actualXml ); + + ConfigurationLogicTestUtils.assertXmlEqual( filteredXml1, filteredXml2 ); + } + + public static void assertVmxVmwareEqual( String expectedVmx, String actualVmx ) throws AssertionError + { + final BufferedReader bfrVmx1 = new BufferedReader( new StringReader( expectedVmx ) ); + final BufferedReader bfrVmx2 = new BufferedReader( new StringReader( actualVmx ) ); + final List linesVmx1 = bfrVmx1.lines().collect( Collectors.toList() ); + final List linesVmx2 = bfrVmx2.lines().collect( Collectors.toList() ); + + // check output size first + if ( linesVmx1.size() != linesVmx2.size() ) { + // create list of items that are expected but missing in the actual output + final List missingItems; + final String missingItemsDesc; + + if ( linesVmx1.size() > linesVmx2.size() ) { + missingItemsDesc = "The following items are expected but missing in the actual output"; + missingItems = new ArrayList( linesVmx1 ); + missingItems.removeAll( linesVmx2 ); + } else { + missingItemsDesc = "The following items are not expected but occuring in the actual output"; + missingItems = new ArrayList( linesVmx2 ); + missingItems.removeAll( linesVmx1 ); + } + + throw new AssertionError( String.format( + "VMX output size is not satisfied: Expected %d lines, but output has %d lines!\n" + + "%s:\n" + + "%s", + linesVmx1.size(), linesVmx2.size(), missingItemsDesc, missingItems ) ); + } - return ConfigurationLogicTestUtils.isContentEqual( filteredContent1, filteredContent2 ); + // check the content of the output line by line + assertEquals( linesVmx1, linesVmx2 ); } } diff --git a/src/test/resources/libvirt/xml/qemu-kvm_default-ubuntu-20-04-vm_transform-editable.xml b/src/test/resources/libvirt/xml/qemu-kvm_default-ubuntu-20-04-vm_transform-editable.xml index bf4de75..ed2210b 100644 --- a/src/test/resources/libvirt/xml/qemu-kvm_default-ubuntu-20-04-vm_transform-editable.xml +++ b/src/test/resources/libvirt/xml/qemu-kvm_default-ubuntu-20-04-vm_transform-editable.xml @@ -54,18 +54,18 @@
- +
- +
- +
- +
diff --git a/src/test/resources/virtualbox/xml/virtualbox_default-ubuntu_transform-editable.vbox b/src/test/resources/virtualbox/xml/virtualbox_default-ubuntu_transform-editable.vbox index 9bfffcd..9c89f4b 100644 --- a/src/test/resources/virtualbox/xml/virtualbox_default-ubuntu_transform-editable.vbox +++ b/src/test/resources/virtualbox/xml/virtualbox_default-ubuntu_transform-editable.vbox @@ -18,6 +18,11 @@ + + + + + @@ -26,11 +31,6 @@ - - - - - -- cgit v1.2.3-55-g7522