/* Copyright (c) 2007-2009 Timothy Wall, All Rights Reserved
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package com.sun.jna;
import java.awt.Frame;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import junit.framework.TestCase;
public class LibraryLoadTest extends TestCase {
private static final String BUILDDIR =
System.getProperty("jna.builddir", "build"
+ (Platform.is64Bit() ? "-d64" : ""));
public void testLoadJNALibrary() {
assertTrue("Point size should never be zero", Pointer.SIZE > 0);
}
public void testLoadJAWT() {
if (GraphicsEnvironment.isHeadless()) return;
Frame f = new Frame(getName());
f.pack();
try {
// FIXME: this works as a test, but fails in ShapedWindowDemo
// if the JAWT load workaround is not used
Native.getWindowPointer(f);
}
finally {
f.dispose();
}
}
public static interface CLibrary extends Library {
int wcslen(WString wstr);
int strlen(String str);
int atol(String str);
Pointer getpwuid(int uid);
int geteuid();
}
public void testLoadAWTAfterJNA() {
if (GraphicsEnvironment.isHeadless()) return;
if (Pointer.SIZE > 0) {
Toolkit.getDefaultToolkit();
}
}
private Object load() {
return Native.loadLibrary(System.getProperty("os.name").startsWith("Windows")
? "msvcrt" : "c", CLibrary.class);
}
public void testLoadCLibrary() {
load();
}
private static final String UNICODE = "\u0444\u043b\u0441\u0432\u0443";
private void copy(File src, File dst) throws Exception {
FileInputStream is = new FileInputStream(src);
FileOutputStream os = new FileOutputStream(dst);
int count;
byte[] buf = new byte[1024];
try {
while ((count = is.read(buf, 0, buf.length)) > 0) {
os.write(buf, 0, count);
}
}
finally {
try { is.close(); } catch(IOException e) { }
try { os.close(); } catch(IOException e) { }
}
}
public void testLoadLibraryWithUnicodeName() throws Exception {
String tmp = System.getProperty("java.io.tmpdir");
String libName = System.mapLibraryName("jnidispatch");
File src = new File(BUILDDIR + "/native", libName);
assertTrue("Expected JNA native library at " + src + " is missing", src.exists());
String newLibName = UNICODE;
if (libName.startsWith("lib"))
newLibName = "lib" + newLibName;
int dot = libName.lastIndexOf(".");
if (dot != -1) {
if (Platform.isMac()) {
newLibName += ".dylib";
}
else {
newLibName += libName.substring(dot, libName.length());
}
}
File dst = new File(tmp, newLibName);
dst.deleteOnExit();
copy(src, dst);
NativeLibrary.addSearchPath(UNICODE, tmp);
NativeLibrary nl = NativeLibrary.getInstance(UNICODE);
nl.dispose();
}
public void testHandleObjectMethods() {
CLibrary lib = (CLibrary)load();
String method = "toString";
try {
lib.toString();
method = "hashCode";
lib.hashCode();
method = "equals";
lib.equals(null);
}
catch(UnsatisfiedLinkError e) {
fail("Object method '" + method + "' not handled");
}
}
public interface TestLib2 extends Library {
int dependentReturnFalse();
}
public void testLoadDependentLibrary() {
try {
TestLib2 lib = (TestLib2)Native.loadLibrary("testlib2", TestLib2.class);
lib.dependentReturnFalse();
}
catch(UnsatisfiedLinkError e) {
// failure expected on anything but windows
if (Platform.isWindows()) {
fail("Failed to load dependent libraries: " + e);
}
}
}
// Ubuntu bug when arch-specific libc is active
// Only fails on *some* functions
public void testLoadProperCLibraryVersion() {
if (Platform.isWindows()) return;
CLibrary lib = (CLibrary)Native.loadLibrary("c", CLibrary.class);
assertNotNull("Couldn't get current user",
lib.getpwuid(lib.geteuid()));
}
public static void main(String[] args) {
junit.textui.TestRunner.run(LibraryLoadTest.class);
}
}