jdk/test/java/lang/System/LoggerFinder/internal/LoggerBridgeTest/LoggerBridgeTest.java
changeset 37672 03684934dc09
parent 36237 963d1115678b
child 44545 83b611b88ac8
equal deleted inserted replaced
37671:7917477e22a8 37672:03684934dc09
    49 import java.lang.System.LoggerFinder;
    49 import java.lang.System.LoggerFinder;
    50 import java.lang.System.Logger;
    50 import java.lang.System.Logger;
    51 import java.lang.System.Logger.Level;
    51 import java.lang.System.Logger.Level;
    52 import java.util.stream.Stream;
    52 import java.util.stream.Stream;
    53 import sun.util.logging.PlatformLogger;
    53 import sun.util.logging.PlatformLogger;
       
    54 import java.lang.reflect.Module;
    54 
    55 
    55 /**
    56 /**
    56  * @test
    57  * @test
    57  * @bug     8140364
    58  * @bug     8140364
    58  * @summary JDK implementation specific unit test for JDK internal artifacts.
    59  * @summary JDK implementation specific unit test for JDK internal artifacts.
   162                 String key, Throwable thrown, Object... params) {
   163                 String key, Throwable thrown, Object... params) {
   163             return LogEvent.of(sequenceNumber, isLoggable, name,
   164             return LogEvent.of(sequenceNumber, isLoggable, name,
   164                     null, null, level, bundle, key,
   165                     null, null, level, bundle, key,
   165                     thrown, params);
   166                     thrown, params);
   166         }
   167         }
       
   168 
   167         public static LogEvent of(long sequenceNumber,
   169         public static LogEvent of(long sequenceNumber,
   168                 boolean isLoggable, String name,
   170                 boolean isLoggable, String name,
   169                 sun.util.logging.PlatformLogger.Level level, ResourceBundle bundle,
   171                 sun.util.logging.PlatformLogger.Level level, ResourceBundle bundle,
   170                 Supplier<String> supplier, Throwable thrown, Object... params) {
   172                 Supplier<String> supplier, Throwable thrown, Object... params) {
   171             return LogEvent.of(sequenceNumber, isLoggable, name,
   173             return LogEvent.of(sequenceNumber, isLoggable, name,
   229     static final Class<?> providerClass;
   231     static final Class<?> providerClass;
   230     static {
   232     static {
   231         try {
   233         try {
   232             // Preload classes before the security manager is on.
   234             // Preload classes before the security manager is on.
   233             providerClass = ClassLoader.getSystemClassLoader().loadClass("LoggerBridgeTest$LogProducerFinder");
   235             providerClass = ClassLoader.getSystemClassLoader().loadClass("LoggerBridgeTest$LogProducerFinder");
   234             ((LoggerFinder)providerClass.newInstance()).getLogger("foo", providerClass);
   236             ((LoggerFinder)providerClass.newInstance()).getLogger("foo", providerClass.getModule());
   235         } catch (Exception ex) {
   237         } catch (Exception ex) {
   236             throw new ExceptionInInitializerError(ex);
   238             throw new ExceptionInInitializerError(ex);
   237         }
   239         }
   238     }
   240     }
   239 
   241 
   413             }
   415             }
   414 
   416 
   415         }
   417         }
   416 
   418 
   417         @Override
   419         @Override
   418         public Logger getLogger(String name, Class<?> caller) {
   420         public Logger getLogger(String name, Module caller) {
   419             SecurityManager sm = System.getSecurityManager();
   421             SecurityManager sm = System.getSecurityManager();
   420             if (sm != null) {
   422             if (sm != null) {
   421                 sm.checkPermission(LOGGERFINDER_PERMISSION);
   423                 sm.checkPermission(LOGGERFINDER_PERMISSION);
   422             }
   424             }
   423             PrivilegedAction<ClassLoader> pa = () -> caller.getClassLoader();
   425             PrivilegedAction<ClassLoader> pa = () -> caller.getClassLoader();
   425             if (callerLoader == null) {
   427             if (callerLoader == null) {
   426                 return system.computeIfAbsent(name, (n) -> new LoggerImpl(n));
   428                 return system.computeIfAbsent(name, (n) -> new LoggerImpl(n));
   427             } else {
   429             } else {
   428                 return user.computeIfAbsent(name, (n) -> new LoggerImpl(n));
   430                 return user.computeIfAbsent(name, (n) -> new LoggerImpl(n));
   429             }
   431             }
       
   432         }
       
   433     }
       
   434 
       
   435     static ClassLoader getClassLoader(Module m) {
       
   436         final boolean before = allowAll.get().getAndSet(true);
       
   437         try {
       
   438             return m.getClassLoader();
       
   439         } finally {
       
   440             allowAll.get().set(before);
   430         }
   441         }
   431     }
   442     }
   432 
   443 
   433     static final sun.util.logging.PlatformLogger.Level[] julLevels = {
   444     static final sun.util.logging.PlatformLogger.Level[] julLevels = {
   434         sun.util.logging.PlatformLogger.Level.ALL,
   445         sun.util.logging.PlatformLogger.Level.ALL,
   495     static {
   506     static {
   496         // jdk.internal.logging.LoggerBridge.getLogger(name, caller)
   507         // jdk.internal.logging.LoggerBridge.getLogger(name, caller)
   497         try {
   508         try {
   498             Class<?> bridgeClass = Class.forName("jdk.internal.logger.LazyLoggers");
   509             Class<?> bridgeClass = Class.forName("jdk.internal.logger.LazyLoggers");
   499             lazyGetLogger = bridgeClass.getDeclaredMethod("getLogger",
   510             lazyGetLogger = bridgeClass.getDeclaredMethod("getLogger",
   500                     String.class, Class.class);
   511                     String.class, Module.class);
   501             lazyGetLogger.setAccessible(true);
   512             lazyGetLogger.setAccessible(true);
   502         } catch (Throwable ex) {
   513         } catch (Throwable ex) {
   503             throw new ExceptionInInitializerError(ex);
   514             throw new ExceptionInInitializerError(ex);
   504         }
   515         }
   505     }
   516     }
   506 
   517 
   507     static Logger getLogger(LoggerFinder provider, String name, Class<?> caller) {
   518     static Logger getLogger(LoggerFinder provider, String name, Module caller) {
   508         Logger logger;
   519         Logger logger;
   509         try {
   520         try {
   510             logger = Logger.class.cast(lazyGetLogger.invoke(null, name, caller));
   521             logger = Logger.class.cast(lazyGetLogger.invoke(null, name, caller));
   511         } catch (Throwable x) {
   522         } catch (Throwable x) {
   512             Throwable t = (x instanceof InvocationTargetException) ?
   523             Throwable t = (x instanceof InvocationTargetException) ?
   520             }
   531             }
   521         }
   532         }
   522         // The method above does not throw exception...
   533         // The method above does not throw exception...
   523         // call the provider here to verify that an exception would have
   534         // call the provider here to verify that an exception would have
   524         // been thrown by the provider.
   535         // been thrown by the provider.
   525         if (logger != null && caller == Thread.class) {
   536         if (logger != null && caller == Thread.class.getModule()) {
   526             Logger log = provider.getLogger(name, caller);
   537             Logger log = provider.getLogger(name, caller);
   527         }
   538         }
   528         return logger;
   539         return logger;
   529     }
   540     }
   530 
   541 
   531     static Logger getLogger(LoggerFinder provider, String name, ResourceBundle bundle, Class<?> caller) {
   542     static Logger getLogger(LoggerFinder provider, String name, ResourceBundle bundle, Module caller) {
   532         if (caller.getClassLoader() != null) {
   543         if (getClassLoader(caller) != null) {
   533             return System.getLogger(name,bundle);
   544             return System.getLogger(name,bundle);
   534         } else {
   545         } else {
   535             return provider.getLocalizedLogger(name, bundle, caller);
   546             return provider.getLocalizedLogger(name, bundle, caller);
   536         }
   547         }
   537     }
   548     }
   612         ResourceBundle loggerBundle = ResourceBundle.getBundle(MyLoggerBundle.class.getName());
   623         ResourceBundle loggerBundle = ResourceBundle.getBundle(MyLoggerBundle.class.getName());
   613         final Map<Object, String> loggerDescMap = new HashMap<>();
   624         final Map<Object, String> loggerDescMap = new HashMap<>();
   614 
   625 
   615 
   626 
   616         Logger appLogger1 = System.getLogger("foo");
   627         Logger appLogger1 = System.getLogger("foo");
   617         loggerDescMap.put(appLogger1, "LogProducer.getApplicationLogger(\"foo\")");
   628         loggerDescMap.put(appLogger1, "System.getLogger(\"foo\")");
   618 
   629 
   619         Logger sysLogger1 = null;
   630         Logger sysLogger1 = null;
   620         try {
   631         try {
   621             sysLogger1 = getLogger(provider, "foo", Thread.class);
   632             sysLogger1 = getLogger(provider, "foo", Thread.class.getModule());
   622             loggerDescMap.put(sysLogger1, "LogProducer.getSystemLogger(\"foo\")");
   633             loggerDescMap.put(sysLogger1, "provider.getLogger(\"foo\", Thread.class.getModule())");
   623             if (!hasRequiredPermissions) {
   634             if (!hasRequiredPermissions) {
   624                 throw new RuntimeException("Managed to obtain a system logger without permission");
   635                 throw new RuntimeException("Managed to obtain a system logger without permission");
   625             }
   636             }
   626         } catch (AccessControlException acx) {
   637         } catch (AccessControlException acx) {
   627             if (hasRequiredPermissions) {
   638             if (hasRequiredPermissions) {
   634         }
   645         }
   635 
   646 
   636 
   647 
   637         Logger appLogger2 =
   648         Logger appLogger2 =
   638                 System.getLogger("foo", loggerBundle);
   649                 System.getLogger("foo", loggerBundle);
   639         loggerDescMap.put(appLogger2, "LogProducer.getApplicationLogger(\"foo\", loggerBundle)");
   650         loggerDescMap.put(appLogger2, "System.getLogger(\"foo\", loggerBundle)");
   640 
   651 
   641         Logger sysLogger2 = null;
   652         Logger sysLogger2 = null;
   642         try {
   653         try {
   643             sysLogger2 = getLogger(provider, "foo", loggerBundle, Thread.class);
   654             sysLogger2 = getLogger(provider, "foo", loggerBundle, Thread.class.getModule());
   644             loggerDescMap.put(sysLogger2, "provider.getSystemLogger(\"foo\", loggerBundle)");
   655             loggerDescMap.put(sysLogger2, "provider.getLogger(\"foo\", loggerBundle, Thread.class.getModule())");
   645             if (!hasRequiredPermissions) {
   656             if (!hasRequiredPermissions) {
   646                 throw new RuntimeException("Managed to obtain a system logger without permission");
   657                 throw new RuntimeException("Managed to obtain a system logger without permission");
   647             }
   658             }
   648         } catch (AccessControlException acx) {
   659         } catch (AccessControlException acx) {
   649             if (hasRequiredPermissions) {
   660             if (hasRequiredPermissions) {
   669         final LogProducerFinder.LoggerImpl sysSink;
   680         final LogProducerFinder.LoggerImpl sysSink;
   670         boolean old = allowControl.get().get();
   681         boolean old = allowControl.get().get();
   671         allowControl.get().set(true);
   682         allowControl.get().set(true);
   672         try {
   683         try {
   673            appSink = LogProducerFinder.LoggerImpl.class.cast(
   684            appSink = LogProducerFinder.LoggerImpl.class.cast(
   674                    provider.getLogger("foo",  LoggerBridgeTest.class));
   685                    provider.getLogger("foo",  LoggerBridgeTest.class.getModule()));
   675            sysSink = LogProducerFinder.LoggerImpl.class.cast(
   686            sysSink = LogProducerFinder.LoggerImpl.class.cast(
   676                         provider.getLogger("foo", Thread.class));
   687                         provider.getLogger("foo", Thread.class.getModule()));
   677         } finally {
   688         } finally {
   678             allowControl.get().set(old);
   689             allowControl.get().set(old);
   679         }
   690         }
   680 
   691 
   681         testLogger(provider, loggerDescMap, "foo", null, convert(appLogger1), appSink);
   692         testLogger(provider, loggerDescMap, "foo", null, convert(appLogger1), appSink);