Skip to content

Commit

Permalink
Fix ELFAnalyserTest for java 6 (remove usage of post-java6 NIO code)
Browse files Browse the repository at this point in the history
  • Loading branch information
matthiasblaesing committed Nov 18, 2017
1 parent 24b2108 commit e700fbf
Showing 1 changed file with 56 additions and 33 deletions.
89 changes: 56 additions & 33 deletions test/com/sun/jna/ELFAnalyserTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@
package com.sun.jna;

import java.io.*;
import java.nio.file.CopyOption;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.junit.AfterClass;
Expand All @@ -15,14 +12,13 @@


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 linuxArmelNoflagLib = new File(testResources, "linux-armel-noflag.so");
private static File linuxArmhfLib = new File(testResources, "linux-armhf.so");
private static File linuxAmd64Lib = new File(testResources, "linux-amd64.so");
private static final File TEST_RESOURCES = new File("build/test-resources");
private static final File WIN32_LIB = new File(TEST_RESOURCES, "win32-x86-64.dll");
private static final File LINUX_ARMEL_LIB = new File(TEST_RESOURCES, "linux-armel.so");
private static final File LINUX_ARMEL_NOFLAG_LIG = new File(TEST_RESOURCES, "linux-armel-noflag.so");
private static final File LINUX_ARMHF_LIB = new File(TEST_RESOURCES, "linux-armhf.so");
private static final File LINUX_AMD64_LIB = new File(TEST_RESOURCES, "linux-amd64.so");

@BeforeClass
public static void initClass() throws IOException {
Expand All @@ -31,32 +27,32 @@ public static void initClass() throws IOException {
File linuxArmhfZip = new File("dist/linux-arm.jar");
File linuxAmd64Zip = new File("dist/linux-x86-64.jar");

testResources.mkdirs();
TEST_RESOURCES.mkdirs();

extractFileFromZip(win32Zip, "jnidispatch.dll", win32Lib);
extractFileFromZip(linuxArmelZip, "libjnidispatch.so", linuxArmelLib);
extractFileFromZip(linuxArmhfZip, "libjnidispatch.so", linuxArmhfLib);
extractFileFromZip(linuxAmd64Zip, "libjnidispatch.so", linuxAmd64Lib);
makeLinuxArmelNoflagLib(linuxArmelLib, linuxArmelNoflagLib);
extractFileFromZip(win32Zip, "jnidispatch.dll", WIN32_LIB);
extractFileFromZip(linuxArmelZip, "libjnidispatch.so", LINUX_ARMEL_LIB);
extractFileFromZip(linuxArmhfZip, "libjnidispatch.so", LINUX_ARMHF_LIB);
extractFileFromZip(linuxAmd64Zip, "libjnidispatch.so", LINUX_AMD64_LIB);
makeLinuxArmelNoflagLib(LINUX_ARMEL_LIB, LINUX_ARMEL_NOFLAG_LIG);
}

@Test
public void testNonELF() throws IOException {
ELFAnalyser ahfd = ELFAnalyser.analyse(win32Lib.getAbsolutePath());
ELFAnalyser ahfd = ELFAnalyser.analyse(WIN32_LIB.getAbsolutePath());
assertFalse(ahfd.isELF());
}

@Test
public void testNonArm() throws IOException {
ELFAnalyser ahfd = ELFAnalyser.analyse(linuxAmd64Lib.getAbsolutePath());
ELFAnalyser ahfd = ELFAnalyser.analyse(LINUX_AMD64_LIB.getAbsolutePath());
assertTrue(ahfd.isELF());
assertFalse(ahfd.isArm());
assertTrue(ahfd.is64Bit());
}

@Test
public void testArmhf() throws IOException {
ELFAnalyser ahfd = ELFAnalyser.analyse(linuxArmhfLib.getAbsolutePath());
ELFAnalyser ahfd = ELFAnalyser.analyse(LINUX_ARMHF_LIB.getAbsolutePath());
assertTrue(ahfd.isELF());
assertTrue(ahfd.isArm());
assertFalse(ahfd.is64Bit());
Expand All @@ -66,7 +62,7 @@ public void testArmhf() throws IOException {

@Test
public void testArmel() throws IOException {
ELFAnalyser ahfd = ELFAnalyser.analyse(linuxArmelLib.getAbsolutePath());
ELFAnalyser ahfd = ELFAnalyser.analyse(LINUX_ARMEL_LIB.getAbsolutePath());
assertTrue(ahfd.isELF());
assertTrue(ahfd.isArm());
assertFalse(ahfd.is64Bit());
Expand All @@ -76,7 +72,7 @@ public void testArmel() throws IOException {

@Test
public void testArmelNoflag() throws IOException {
ELFAnalyser ahfd = ELFAnalyser.analyse(linuxArmelNoflagLib.getAbsolutePath());
ELFAnalyser ahfd = ELFAnalyser.analyse(LINUX_ARMEL_NOFLAG_LIG.getAbsolutePath());
assertTrue(ahfd.isELF());
assertTrue(ahfd.isArm());
assertFalse(ahfd.is64Bit());
Expand All @@ -86,12 +82,12 @@ public void testArmelNoflag() throws IOException {

@AfterClass
public static void afterClass() throws IOException {
linuxAmd64Lib.delete();
linuxArmhfLib.delete();
linuxArmelLib.delete();
win32Lib.delete();
linuxArmelNoflagLib.delete();
testResources.delete();
LINUX_AMD64_LIB.delete();
LINUX_ARMHF_LIB.delete();
LINUX_ARMEL_LIB.delete();
WIN32_LIB.delete();
LINUX_ARMEL_NOFLAG_LIG.delete();
TEST_RESOURCES.delete();
}

private static void extractFileFromZip(File zipTarget, String zipEntryName, File outputFile) throws IOException {
Expand All @@ -104,11 +100,7 @@ private static void extractFileFromZip(File zipTarget, String zipEntryName, File
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);
}
copyStream(is, os);
} finally {
os.close();
}
Expand All @@ -121,13 +113,44 @@ private static void extractFileFromZip(File zipTarget, String zipEntryName, File
// The procedure call standard is coded on the second byte.
private static void makeLinuxArmelNoflagLib(File sourceFile, File outputFile) throws IOException {
final int POS_ABI_FLOAT_BIT = (byte) 0x25;
Files.copy(sourceFile.toPath(), outputFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
copyFile(sourceFile, outputFile);

RandomAccessFile out = new RandomAccessFile(outputFile, "rw");

out.seek(POS_ABI_FLOAT_BIT);
out.write(0);

out.close();
}

private static void copyFile(File sourceFile, File outputFile) throws IOException {
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = new FileInputStream(sourceFile);
outputStream = new FileOutputStream(outputFile);
copyStream(inputStream, outputStream);
} finally {
closeSilently(inputStream);
closeSilently(outputStream);
}
}

private static void copyStream(InputStream is, OutputStream os) throws IOException {
int read;
byte[] buffer = new byte[1024 * 1024];
while ((read = is.read(buffer)) > 0) {
os.write(buffer, 0, read);
}
}

private static void closeSilently(Closeable closeable) {
if(closeable == null) {
return;
}
try {
closeable.close();
} catch (IOException ex) {}
}
}

0 comments on commit e700fbf

Please sign in to comment.