package com.sun.jna; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.junit.AfterClass; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.BeforeClass; import org.junit.Test; public class ELFAnalyserTest { private static File testResources = new File("build/test-resources"); private static File win32Lib = new File(testResources, "win32-x86-64.dll"); private static File linuxArmelLib = new File(testResources, "linux-armel.so"); private static File linuxArmhfLib = new File(testResources, "linux-armhf.so"); private static File linuxAmd64Lib = new File(testResources, "linux-amd64.so"); @BeforeClass public static void initClass() throws IOException { File win32Zip = new File("lib/native/win32-x86-64.jar"); File linuxArmelZip = new File("lib/native/linux-armel.jar"); File linuxArmhfZip = new File("lib/native/linux-arm.jar"); File linuxAmd64Zip = new File("lib/native/linux-x86-64.jar"); testResources.mkdirs(); extractFileFromZip(win32Zip, "jnidispatch.dll", win32Lib); extractFileFromZip(linuxArmelZip, "libjnidispatch.so", linuxArmelLib); extractFileFromZip(linuxArmhfZip, "libjnidispatch.so", linuxArmhfLib); extractFileFromZip(linuxAmd64Zip, "libjnidispatch.so", linuxAmd64Lib); } @Test public void testNonELF() throws IOException { ELFAnalyser ahfd = ELFAnalyser.analyse(win32Lib.getAbsolutePath()); assertFalse(ahfd.isELF()); } @Test public void testNonArm() throws IOException { ELFAnalyser ahfd = ELFAnalyser.analyse(linuxAmd64Lib.getAbsolutePath()); assertTrue(ahfd.isELF()); assertFalse(ahfd.isArm()); assertTrue(ahfd.is64Bit()); } @Test public void testArmhf() throws IOException { ELFAnalyser ahfd = ELFAnalyser.analyse(linuxArmhfLib.getAbsolutePath()); assertTrue(ahfd.isELF()); assertTrue(ahfd.isArm()); assertFalse(ahfd.is64Bit()); assertFalse(ahfd.isArmSoftFloat()); assertTrue(ahfd.isArmHardFloat()); } @Test public void testArmel() throws IOException { ELFAnalyser ahfd = ELFAnalyser.analyse(linuxArmelLib.getAbsolutePath()); assertTrue(ahfd.isELF()); assertTrue(ahfd.isArm()); assertFalse(ahfd.is64Bit()); assertTrue(ahfd.isArmSoftFloat()); assertFalse(ahfd.isArmHardFloat()); } @AfterClass public static void afterClass() throws IOException { linuxAmd64Lib.delete(); linuxArmhfLib.delete(); linuxArmelLib.delete(); win32Lib.delete(); testResources.delete(); } private static void extractFileFromZip(File zipTarget, String zipEntryName, File outputFile) throws IOException { ZipFile zip = new ZipFile(zipTarget); try { ZipEntry entry = zip.getEntry(zipEntryName); if(entry == null) { throw new IOException("ZipEntry for name " + zipEntryName + " not found in " + zipTarget.getAbsolutePath()); } InputStream is = zip.getInputStream(entry); // Implicitly closed by closing ZipFile OutputStream os = new FileOutputStream(outputFile); try { int read; byte[] buffer = new byte[1024 * 1024]; while((read = is.read(buffer)) > 0) { os.write(buffer, 0, read); } } finally { os.close(); } } finally { zip.close(); } } }