From db01751ff0b3426ee101ed7371d62cca8ee4dca8 Mon Sep 17 00:00:00 2001 From: Charles Oliver Nutter Date: Mon, 14 Jun 2021 15:52:15 -0500 Subject: [PATCH] Test for default methods on interface See #249. --- src/test/java/jnr/ffi/InvocationTest.java | 17 +++++++++++++++++ src/test/java/jnr/ffi/TstUtil.java | 14 ++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/test/java/jnr/ffi/InvocationTest.java b/src/test/java/jnr/ffi/InvocationTest.java index c8ecadafa..c7050f353 100644 --- a/src/test/java/jnr/ffi/InvocationTest.java +++ b/src/test/java/jnr/ffi/InvocationTest.java @@ -21,6 +21,8 @@ import org.junit.BeforeClass; import org.junit.Test; +import java.lang.invoke.MethodHandles; + import static org.junit.Assert.assertEquals; /** @@ -31,6 +33,14 @@ public static interface TestLib { int ret_int32_t(int i); } + public static interface TestLibWithDefault { + static final MethodHandles.Lookup lookup = MethodHandles.lookup(); + int ret_int32_t(int i); + default int doesNotExist(int i) { + return ret_int32_t(i); + } + } + static TestLib testlib; @BeforeClass @@ -44,4 +54,11 @@ public void hammer() throws Throwable { assertEquals(i, testlib.ret_int32_t(i)); } } + + @Test + public void testDefault() throws Throwable { + TestLibWithDefault withDefault = TstUtil.loadTestLib(TestLibWithDefault.class, TestLibWithDefault.lookup); + + assertEquals(testlib.ret_int32_t(1234), withDefault.doesNotExist(1234)); + } } diff --git a/src/test/java/jnr/ffi/TstUtil.java b/src/test/java/jnr/ffi/TstUtil.java index b07730ad3..76523270f 100644 --- a/src/test/java/jnr/ffi/TstUtil.java +++ b/src/test/java/jnr/ffi/TstUtil.java @@ -20,6 +20,7 @@ import jnr.ffi.provider.FFIProvider; +import java.lang.invoke.MethodHandles; import java.nio.ByteBuffer; import java.util.Collections; import java.util.Map; @@ -42,11 +43,20 @@ public static interface HelperLib { } public static T loadTestLib(Class interfaceClass) { + return loadTestLib(interfaceClass, (MethodHandles.Lookup) null); + } + + public static T loadTestLib(Class interfaceClass, MethodHandles.Lookup lookup) { final Map options = Collections.emptyMap(); - return loadTestLib(interfaceClass, options); + return loadTestLib(interfaceClass, lookup, options); } + public static T loadTestLib(Class interfaceClass, Map options) { - LibraryLoader loader = (provider != null ? provider : FFIProvider.getSystemProvider()).createLibraryLoader(interfaceClass); + return loadTestLib(interfaceClass, null, options); + } + + public static T loadTestLib(Class interfaceClass, MethodHandles.Lookup lookup, Map options) { + LibraryLoader loader = (provider != null ? provider : FFIProvider.getSystemProvider()).createLibraryLoader(interfaceClass, lookup); loader.library(libname); for (Map.Entry option : options.entrySet()) {