From 31d9ad782a99acb2ca5bd0cf1b8c85ab93b4647d Mon Sep 17 00:00:00 2001 From: Steven Schlansker Date: Mon, 3 Jan 2022 18:49:19 -0800 Subject: [PATCH] Add jdk11 compat tests for Blackbird cross-classloader access This test fails until the issue is fixed in Blackbird. https://github.com/FasterXML/jackson-modules-base/issues/138 --- jdk11-tests/pom.xml | 4 + .../test/blackbird/BlackbirdCompatTest.java | 77 +++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 jdk11-tests/src/test/java/com/fasterxml/jackson/compat11/test/blackbird/BlackbirdCompatTest.java diff --git a/jdk11-tests/pom.xml b/jdk11-tests/pom.xml index 0087a23..3d6ceb5 100644 --- a/jdk11-tests/pom.xml +++ b/jdk11-tests/pom.xml @@ -16,6 +16,10 @@ com.fasterxml.jackson.module jackson-module-afterburner + + com.fasterxml.jackson.module + jackson-module-blackbird + com.fasterxml.jackson.dataformat diff --git a/jdk11-tests/src/test/java/com/fasterxml/jackson/compat11/test/blackbird/BlackbirdCompatTest.java b/jdk11-tests/src/test/java/com/fasterxml/jackson/compat11/test/blackbird/BlackbirdCompatTest.java new file mode 100644 index 0000000..5d5147c --- /dev/null +++ b/jdk11-tests/src/test/java/com/fasterxml/jackson/compat11/test/blackbird/BlackbirdCompatTest.java @@ -0,0 +1,77 @@ +package com.fasterxml.jackson.compat11.test.blackbird; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.lang.reflect.Constructor; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.module.blackbird.BlackbirdModule; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class BlackbirdCompatTest { + + private final String resourceName = + (BlackbirdCompatTest.class.getName() + "$Data") + .replace('.', '/').concat(".class"); + + @Test + public void loadInChildClassloader() throws Exception { + TestLoader loader = new TestLoader(getClass().getClassLoader()); + Class clazz = Class.forName(Data.class.getName(), true, loader); + ObjectMapper mapper = new ObjectMapper().registerModule(new BlackbirdModule()); + Constructor constructor = clazz.getConstructor(int.class); + Object data = constructor.newInstance(42); + assertEquals("{\"field\":42}", mapper.writeValueAsString(data)); + } + + public static class Data { + private int field; + + public Data(int field) { + this.field = field; + } + + public int getField() { + return field; + } + + public void setField(int field) { + this.field = field; + } + } + + public class TestLoader extends ClassLoader { + public TestLoader(ClassLoader parent) { + super(parent); + } + + @Override + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + synchronized (getClassLoadingLock(name)) { + try { + Class clazz; + if (Data.class.getName().equals(name)) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + InputStream in = getResource(resourceName).openStream(); + int i; + while ((i = in.read()) != -1) { + baos.write(i); + } + byte[] bytes = baos.toByteArray(); + clazz = defineClass(name, bytes, 0, bytes.length); + } else { + clazz = super.loadClass(name, resolve); + } + if (resolve) { + resolveClass(clazz); + } + return clazz; + } catch (Exception e) { + throw new ClassNotFoundException("Unable to load class", e); + } + } + } + } +}