diff options
Diffstat (limited to 'src/test/java/org/openslx/firmware')
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" ) ); + } +} |