summaryrefslogtreecommitdiffstats
path: root/src/test/java/org/openslx/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/org/openslx/firmware')
-rw-r--r--src/test/java/org/openslx/firmware/QemuFirmwareTest.java45
-rw-r--r--src/test/java/org/openslx/firmware/QemuFirmwareTestResources.java101
-rw-r--r--src/test/java/org/openslx/firmware/QemuFirmwareUtilTest.java98
3 files changed, 244 insertions, 0 deletions
diff --git a/src/test/java/org/openslx/firmware/QemuFirmwareTest.java b/src/test/java/org/openslx/firmware/QemuFirmwareTest.java
new file mode 100644
index 0000000..3088265
--- /dev/null
+++ b/src/test/java/org/openslx/firmware/QemuFirmwareTest.java
@@ -0,0 +1,45 @@
+package org.openslx.firmware;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import java.io.File;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+public class QemuFirmwareTest
+{
+ @Test
+ @DisplayName( "Test parsing of valid QEMU firmware specification file" )
+ public void testQemuFirmwareFromFwSpecValid()
+ {
+ final File fwSpecFile = QemuFirmwareTestResources.getQemuFirmwareSpecFile( "60-edk2-x86_64.json" );
+
+ final QemuFirmware firmware = QemuFirmware.fromFwSpec( fwSpecFile );
+
+ assertNotNull( firmware );
+ assertEquals( "UEFI firmware for x86_64", firmware.getDescription() );
+ assertEquals( 1, firmware.getInterfaceTypes().size() );
+ assertEquals( "uefi", firmware.getInterfaceTypes().get( 0 ) );
+ assertEquals( "/usr/share/qemu/edk2-x86_64-code.fd", firmware.getMapping().getExecutable().getFileName() );
+ assertEquals( "/usr/share/qemu/edk2-i386-vars.fd", firmware.getMapping().getNvramTemplate().getFileName() );
+ assertEquals( 1, firmware.getTargets().size() );
+ assertEquals( "x86_64", firmware.getTargets().get( 0 ).getArchitecture() );
+ assertEquals( 2, firmware.getTargets().get( 0 ).getMachines().size() );
+ assertEquals( "pc-i440fx-*", firmware.getTargets().get( 0 ).getMachines().get( 0 ) );
+ assertEquals( "pc-q35-*", firmware.getTargets().get( 0 ).getMachines().get( 1 ) );
+ assertEquals( 3, firmware.getFeatures().size() );
+ assertEquals( 0, firmware.getTags().size() );
+ }
+
+ @Test
+ @DisplayName( "Test parsing of invalid QEMU firmware specification file" )
+ public void testQemuFirmwareFromFwSpecInvalid()
+ {
+ final QemuFirmware firmware = QemuFirmware.fromFwSpec( null );
+
+ assertNull( firmware );
+ }
+}
diff --git a/src/test/java/org/openslx/firmware/QemuFirmwareTestResources.java b/src/test/java/org/openslx/firmware/QemuFirmwareTestResources.java
new file mode 100644
index 0000000..05397e6
--- /dev/null
+++ b/src/test/java/org/openslx/firmware/QemuFirmwareTestResources.java
@@ -0,0 +1,101 @@
+package org.openslx.firmware;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.nio.file.Files;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import org.apache.commons.io.FileUtils;
+import org.openslx.util.Resources;
+
+public class QemuFirmwareTestResources
+{
+ private static final String QEMU_PREFIX_PATH = Resources.PATH_SEPARATOR + "qemu";
+ private static final String QEMU_PREFIX_PATH_FW = QEMU_PREFIX_PATH + Resources.PATH_SEPARATOR + "firmware";
+
+ private static final String QEMU_TEMP_PREFIX = "qemu-";
+
+ public static String getQemuFirmwareSpecPath()
+ {
+ String fwSpecDir = null;
+
+ try {
+ fwSpecDir = getResourceDirectory( QemuFirmwareTestResources.class, QEMU_PREFIX_PATH_FW );
+ } catch ( IOException e ) {
+ fwSpecDir = null;
+ }
+
+ return fwSpecDir;
+ }
+
+ private static String getResourceDirectory( Class<?> clazz, String resourceDir ) throws IOException
+ {
+ final String fwDirPath = resourceDir.substring( 1 ).concat( Resources.PATH_SEPARATOR );
+ final URL fwResource = clazz.getResource( resourceDir );
+ final File fwDirectory;
+ String fwDirectoryPath = null;
+
+ if ( fwResource != null && "jar".equals( fwResource.getProtocol() ) ) {
+ // create temporary directory to copy Jar files into it
+ fwDirectory = Files.createTempDirectory( QEMU_TEMP_PREFIX ).toFile();
+
+ // obtain file list from a directory within the Jar file
+ // strip out only the JAR file path
+ final String jarPath = fwResource.getPath().substring( 5, fwResource.getPath().indexOf( "!" ) );
+ final JarFile jar = new JarFile( URLDecoder.decode( jarPath, "UTF-8" ) );
+ // get all entries in the Jar file
+ final Enumeration<JarEntry> jarEntries = jar.entries();
+ final Set<String> fileNames = new HashSet<String>();
+ while ( jarEntries.hasMoreElements() ) {
+ final String jarEntryName = jarEntries.nextElement().getName();
+ if ( jarEntryName.startsWith( fwDirPath ) ) {
+ String jarEntry = jarEntryName.substring( fwDirPath.length() );
+ if ( !jarEntry.isEmpty() ) {
+ fileNames.add( jarEntry );
+ }
+ }
+ }
+
+ // copy each file from the Jar to the temporary directory
+ fileNames.forEach( fileName -> {
+ final String resourceFileName = resourceDir + Resources.PATH_SEPARATOR + fileName;
+ final File tempFile = new File( fwDirectory.getPath() + File.separator + fileName );
+ final InputStream fileInput = QemuFirmwareTestResources.class.getResourceAsStream( resourceFileName );
+ try {
+ FileUtils.copyInputStreamToFile( fileInput, tempFile );
+ } catch ( IOException e ) {
+ e.printStackTrace();
+ }
+ tempFile.deleteOnExit();
+ } );
+ fwDirectory.deleteOnExit();
+ } else if ( fwResource != null && "file".equals( fwResource.getProtocol() ) ) {
+ fwDirectory = new File( fwResource.getFile() );
+ } else {
+ fwDirectory = null;
+ }
+
+ try {
+ fwDirectoryPath = fwDirectory.toURI().toURL().getFile();
+ } catch ( MalformedURLException | NullPointerException e ) {
+ fwDirectoryPath = null;
+ }
+
+ return fwDirectoryPath;
+ }
+
+ public static File getQemuFirmwareSpecFile( String fileName )
+ {
+ final String fwSpecFilePath = QEMU_PREFIX_PATH_FW + Resources.PATH_SEPARATOR + fileName;
+ final URL fwSpecFileUrl = QemuFirmwareTestResources.class.getResource( fwSpecFilePath );
+ return new File( fwSpecFileUrl.getFile() );
+ }
+}
diff --git a/src/test/java/org/openslx/firmware/QemuFirmwareUtilTest.java b/src/test/java/org/openslx/firmware/QemuFirmwareUtilTest.java
new file mode 100644
index 0000000..75ce286
--- /dev/null
+++ b/src/test/java/org/openslx/firmware/QemuFirmwareUtilTest.java
@@ -0,0 +1,98 @@
+package org.openslx.firmware;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.nio.file.Paths;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.openslx.libvirt.domain.Domain;
+import org.openslx.libvirt.domain.DomainTest;
+
+public class QemuFirmwareUtilTest
+{
+ @Test
+ @DisplayName( "Test that lookup of OS loader from Libvirt domain file succeeds" )
+ public void testQemuFirmwareUtilLookupTargetOsLoaderValid() throws FirmwareException
+ {
+ final String fwSpecPath = QemuFirmwareTestResources.getQemuFirmwareSpecPath();
+ final Domain config = DomainTest
+ .getDomain( "qemu-kvm_default-ubuntu-20-04-vm_transform-non-persistent_uefi.xml" );
+
+ final String targetOsLoader = QemuFirmwareUtil.lookupTargetOsLoader( fwSpecPath, config.getOsLoader(),
+ config.getOsArch(), config.getOsMachine() );
+
+ assertEquals( Paths.get( "/usr/share/qemu/edk2-x86_64-code.fd" ).toString(), targetOsLoader );
+ }
+
+ @Test
+ @DisplayName( "Test that lookup of OS loader from Archlinux path succeeds" )
+ public void testQemuFirmwareUtilLookupTargetOsLoaderValidArchlinux() throws FirmwareException
+ {
+ final String fwSpecPath = QemuFirmwareTestResources.getQemuFirmwareSpecPath();
+
+ final String targetOsLoader = QemuFirmwareUtil.lookupTargetOsLoader( fwSpecPath,
+ "/usr/share/edk2-ovmf/x64/OVMF_CODE.fd", "x86_64", "pc-q35-5.0" );
+
+ assertEquals( Paths.get( "/usr/share/qemu/edk2-x86_64-code.fd" ).toString(), targetOsLoader );
+ }
+
+ @Test
+ @DisplayName( "Test that lookup of OS loader from Debian path succeeds" )
+ public void testQemuFirmwareUtilLookupTargetOsLoaderValidDebian() throws FirmwareException
+ {
+ final String fwSpecPath = QemuFirmwareTestResources.getQemuFirmwareSpecPath();
+
+ final String targetOsLoader = QemuFirmwareUtil.lookupTargetOsLoader( fwSpecPath,
+ "/usr/share/OVMF/OVMF_CODE.fd", "x86_64", "pc-q35-5.0" );
+
+ assertEquals( Paths.get( "/usr/share/qemu/edk2-x86_64-code.fd" ).toString(), targetOsLoader );
+ }
+
+ @Test
+ @DisplayName( "Test that lookup of OS loader from CentOS path succeeds" )
+ public void testQemuFirmwareUtilLookupTargetOsLoaderValidCentOs() throws FirmwareException
+ {
+ final String fwSpecPath = QemuFirmwareTestResources.getQemuFirmwareSpecPath();
+
+ final String targetOsLoader = QemuFirmwareUtil.lookupTargetOsLoader( fwSpecPath,
+ "/usr/share/edk2/ovmf/OVMF_CODE.cc.fd", "x86_64", "pc-q35-5.0" );
+
+ assertEquals( Paths.get( "/usr/share/qemu/edk2-x86_64-code.fd" ).toString(), targetOsLoader );
+ }
+
+ @Test
+ @DisplayName( "Test that lookup of OS loader from OpenSUSE path succeeds" )
+ public void testQemuFirmwareUtilLookupTargetOsLoaderValidOpenSuse() throws FirmwareException
+ {
+ final String fwSpecPath = QemuFirmwareTestResources.getQemuFirmwareSpecPath();
+
+ final String targetOsLoader = QemuFirmwareUtil.lookupTargetOsLoader( fwSpecPath,
+ "/usr/share/qemu/ovmf-x86_64-4m-code.bin", "x86_64", "pc-q35-5.0" );
+
+ assertEquals( Paths.get( "/usr/share/qemu/edk2-x86_64-code.fd" ).toString(), targetOsLoader );
+ }
+
+ @Test
+ @DisplayName( "Test that lookup of OS loader from Ubuntu path succeeds" )
+ public void testQemuFirmwareUtilLookupTargetOsLoaderValidUbuntu() throws FirmwareException
+ {
+ final String fwSpecPath = QemuFirmwareTestResources.getQemuFirmwareSpecPath();
+
+ final String targetOsLoader = QemuFirmwareUtil.lookupTargetOsLoader( fwSpecPath,
+ "/usr/share/OVMF/OVMF_CODE_4M.fd", "x86_64", "pc-q35-5.0" );
+
+ assertEquals( Paths.get( "/usr/share/qemu/edk2-x86_64-code.fd" ).toString(), targetOsLoader );
+ }
+
+ @Test
+ @DisplayName( "Test that lookup of non-existent OS loader for non-existent architecture fails" )
+ public void testQemuFirmwareUtilLookupTargetOsLoaderInvalid() throws FirmwareException
+ {
+ final String fwSpecPath = QemuFirmwareTestResources.getQemuFirmwareSpecPath();
+
+ assertThrows( FirmwareException.class, () -> QemuFirmwareUtil.lookupTargetOsLoader( fwSpecPath,
+ Paths.get( "/non/existent/loader.fd" ).toString(), "x87", "pc-q35-6.0" ) );
+ }
+}