Skip to content

Commit e3a97f8

Browse files
committed
Add simple unit test for ReflectionUnlocker
1 parent 0f5f5ec commit e3a97f8

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

pom.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,16 @@
100100
<optional>true</optional>
101101
</dependency>
102102
</dependencies>
103+
104+
<profiles>
105+
<profile>
106+
<id>jpms</id>
107+
<activation>
108+
<jdk>[9,)</jdk>
109+
</activation>
110+
<properties>
111+
<scijava.surefire.args>--add-opens=java.base/java.lang=ALL-UNNAMED</scijava.surefire.args>
112+
</properties>
113+
</profile>
114+
</profiles>
103115
</project>
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*-
2+
* #%L
3+
* Launcher for SciJava applications.
4+
* %%
5+
* Copyright (C) 2007 - 2025 SciJava developers.
6+
* %%
7+
* Redistribution and use in source and binary forms, with or without
8+
* modification, are permitted provided that the following conditions are met:
9+
*
10+
* 1. Redistributions of source code must retain the above copyright notice,
11+
* this list of conditions and the following disclaimer.
12+
* 2. Redistributions in binary form must reproduce the above copyright notice,
13+
* this list of conditions and the following disclaimer in the documentation
14+
* and/or other materials provided with the distribution.
15+
*
16+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
20+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26+
* POSSIBILITY OF SUCH DAMAGE.
27+
* #L%
28+
*/
29+
30+
package org.scijava.launcher;
31+
32+
import org.junit.jupiter.api.Test;
33+
34+
import java.awt.Panel;
35+
import java.lang.reflect.Field;
36+
37+
import static org.junit.jupiter.api.Assertions.assertEquals;
38+
import static org.junit.jupiter.api.Assertions.fail;
39+
40+
/**
41+
* Tests {@link ReflectionUnlocker}.
42+
*
43+
* @author Curtis Rueden
44+
*/
45+
public class ReflectionUnlockerTest {
46+
47+
private String getPrivateString() throws NoSuchFieldException, IllegalAccessException {
48+
Field f = Panel.class.getDeclaredField("base");
49+
f.setAccessible(true);
50+
return (String) f.get(null);
51+
}
52+
53+
@Test
54+
public void testUnlockAll() throws Exception {
55+
int majorVersion = Integer.parseInt(System.getProperty("java.version").split("\\.")[0]);
56+
if (majorVersion >= 17) {
57+
// Check that we are *not* able to instantiate java.awt.Desktop with its private no-args constructor.
58+
try {
59+
final String value = getPrivateString();
60+
fail("Expected exception but got: " + value);
61+
}
62+
catch (Exception e) { }
63+
}
64+
ReflectionUnlocker.unlockAll();
65+
66+
// Now try again.
67+
final String value = getPrivateString();
68+
assertEquals("panel", value);
69+
}
70+
}

0 commit comments

Comments
 (0)