< prev index next >
test/java/lang/System/Logger/custom/CustomLoggerTest.java
Print this page
@@ -44,10 +44,12 @@
import java.util.function.Supplier;
import java.lang.System.LoggerFinder;
import java.lang.System.Logger;
import java.lang.System.Logger.Level;
import java.util.stream.Stream;
+import java.lang.reflect.Module;
+import java.security.AllPermission;
/**
* @test
* @bug 8140364
* @summary Tests loggers returned by System.getLogger with a naive implementation
@@ -68,10 +70,16 @@
@Override
protected AtomicBoolean initialValue() {
return new AtomicBoolean(false);
}
};
+ static final ThreadLocal<AtomicBoolean> allowAll = new ThreadLocal<AtomicBoolean>() {
+ @Override
+ protected AtomicBoolean initialValue() {
+ return new AtomicBoolean(false);
+ }
+ };
public static class MyBundle extends ResourceBundle {
final ConcurrentHashMap<String,String> map = new ConcurrentHashMap<>();
@@ -239,22 +247,27 @@
eventQueue.add(event);
}
}
@Override
- public Logger getLogger(String name, Class<?> caller) {
+ public Logger getLogger(String name, Module caller) {
// We should check the permission to obey the API contract, but
// what happens if we don't?
// This is the main difference compared with what we test in
// java/lang/System/LoggerFinder/BaseLoggerFinderTest
SecurityManager sm = System.getSecurityManager();
if (sm != null && doChecks) {
sm.checkPermission(SimplePolicy.LOGGERFINDER_PERMISSION);
}
- PrivilegedAction<ClassLoader> pa = () -> caller.getClassLoader();
- ClassLoader callerLoader = AccessController.doPrivileged(pa);
+ final boolean before = allowAll.get().getAndSet(true);
+ final ClassLoader callerLoader;
+ try {
+ callerLoader = caller.getClassLoader();
+ } finally {
+ allowAll.get().set(before);
+ }
if (callerLoader == null) {
return system.computeIfAbsent(name, (n) -> new LoggerImpl(n));
} else {
return user.computeIfAbsent(name, (n) -> new LoggerImpl(n));
}
@@ -265,11 +278,11 @@
static enum TestCases {NOSECURITY, NOPERMISSIONS, WITHPERMISSIONS};
static void setSecurityManager() {
if (System.getSecurityManager() == null) {
- Policy.setPolicy(new SimplePolicy(allowControl));
+ Policy.setPolicy(new SimplePolicy(allowControl, allowAll));
System.setSecurityManager(new SecurityManager());
}
}
public static void main(String[] args) {
if (args.length == 0)
@@ -282,13 +295,13 @@
// 1. Obtain destination loggers directly from the LoggerFinder
// - LoggerFinder.getLogger("foo", type)
BaseLoggerFinder provider =
BaseLoggerFinder.class.cast(LoggerFinder.getLoggerFinder());
BaseLoggerFinder.LoggerImpl appSink =
- BaseLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", CustomLoggerTest.class));
+ BaseLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", CustomLoggerTest.class.getModule()));
BaseLoggerFinder.LoggerImpl sysSink =
- BaseLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", Thread.class));
+ BaseLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", Thread.class.getModule()));
Stream.of(args).map(TestCases::valueOf).forEach((testCase) -> {
switch (testCase) {
case NOSECURITY:
@@ -693,36 +706,48 @@
public static class SimplePolicy extends Policy {
static final RuntimePermission LOGGERFINDER_PERMISSION =
new RuntimePermission("loggerFinder");
final Permissions permissions;
+ final Permissions controlPermissions;
final Permissions allPermissions;
final ThreadLocal<AtomicBoolean> allowControl;
- public SimplePolicy(ThreadLocal<AtomicBoolean> allowControl) {
+ final ThreadLocal<AtomicBoolean> allowAll;
+ public SimplePolicy(ThreadLocal<AtomicBoolean> allowControl, ThreadLocal<AtomicBoolean> allowAll) {
this.allowControl = allowControl;
+ this.allowAll = allowAll;
permissions = new Permissions();
// these are used for configuring the test itself...
+ controlPermissions = new Permissions();
+ controlPermissions.add(LOGGERFINDER_PERMISSION);
+
+ // these are used for simulating a doPrivileged call from
+ // a class in the BCL
allPermissions = new Permissions();
- allPermissions.add(LOGGERFINDER_PERMISSION);
+ allPermissions.add(new AllPermission());
+
+ }
+
+ Permissions permissions() {
+ if (allowAll.get().get()) return allPermissions;
+ if (allowControl.get().get()) return controlPermissions;
+ return permissions;
}
@Override
public boolean implies(ProtectionDomain domain, Permission permission) {
- if (allowControl.get().get()) return allPermissions.implies(permission);
- return permissions.implies(permission);
+ return permissions().implies(permission);
}
@Override
public PermissionCollection getPermissions(CodeSource codesource) {
- return new PermissionsBuilder().addAll(allowControl.get().get()
- ? allPermissions : permissions).toPermissions();
+ return new PermissionsBuilder().addAll(permissions()).toPermissions();
}
@Override
public PermissionCollection getPermissions(ProtectionDomain domain) {
- return new PermissionsBuilder().addAll(allowControl.get().get()
- ? allPermissions : permissions).toPermissions();
+ return new PermissionsBuilder().addAll(permissions()).toPermissions();
}
}
}
< prev index next >