36 import java.util.HashMap;
37 import java.util.Map;
38 import java.util.ResourceBundle;
39 import java.util.stream.Stream;
40 import java.util.concurrent.ConcurrentHashMap;
41 import java.util.concurrent.atomic.AtomicBoolean;
42 import java.util.concurrent.atomic.AtomicLong;
43 import java.util.function.Supplier;
44 import java.lang.System.LoggerFinder;
45 import java.lang.System.Logger;
46 import java.lang.System.Logger.Level;
47 import java.security.AccessController;
48 import java.security.PrivilegedAction;
49 import java.util.EnumSet;
50 import java.util.Iterator;
51 import java.util.Locale;
52 import java.util.ServiceConfigurationError;
53 import java.util.ServiceLoader;
54 import java.util.concurrent.atomic.AtomicReference;
55 import jdk.internal.logger.SimpleConsoleLogger;
56
57 /**
58 * @test
59 * @bug 8140364
60 * @summary JDK implementation specific unit test for LoggerFinderLoader.
61 * Tests the behavior of LoggerFinderLoader with respect to the
62 * value of the internal diagnosability switches. Also test the
63 * DefaultLoggerFinder and SimpleConsoleLogger implementation.
64 * @modules java.base/sun.util.logging
65 * java.base/jdk.internal.logger
66 * @build AccessSystemLogger LoggerFinderLoaderTest CustomSystemClassLoader
67 * @run driver AccessSystemLogger
68 * @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader LoggerFinderLoaderTest NOSECURITY
69 * @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader LoggerFinderLoaderTest NOPERMISSIONS
70 * @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader LoggerFinderLoaderTest WITHPERMISSIONS
71 * @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true LoggerFinderLoaderTest NOSECURITY
72 * @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true LoggerFinderLoaderTest NOPERMISSIONS
73 * @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true LoggerFinderLoaderTest WITHPERMISSIONS
74 * @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true -Djdk.logger.finder.error=ERROR LoggerFinderLoaderTest NOSECURITY
75 * @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true -Djdk.logger.finder.error=ERROR LoggerFinderLoaderTest NOPERMISSIONS
149 return name;
150 }
151
152 @Override
153 public boolean isLoggable(Logger.Level level) {
154 return logger.isLoggable(level);
155 }
156
157 @Override
158 public void log(Logger.Level level, ResourceBundle bundle, String key, Throwable thrown) {
159 logger.log(level, bundle, key, thrown);
160 }
161
162 @Override
163 public void log(Logger.Level level, ResourceBundle bundle, String format, Object... params) {
164 logger.log(level, bundle, format, params);
165 }
166
167 }
168
169 public Logger getLogger(String name, Class<?> caller);
170 public Logger getLocalizedLogger(String name, ResourceBundle bundle, Class<?> caller);
171 }
172
173 public static class BaseLoggerFinder extends LoggerFinder implements TestLoggerFinder {
174
175 static final RuntimePermission LOGGERFINDER_PERMISSION =
176 new RuntimePermission("loggerFinder");
177 public BaseLoggerFinder() {
178 if (fails.get()) {
179 throw new RuntimeException("Simulate exception while loading provider");
180 }
181 }
182
183 System.Logger createSimpleLogger(String name) {
184 PrivilegedAction<System.Logger> pa = () -> SimpleConsoleLogger.makeSimpleLogger(name);
185 return AccessController.doPrivileged(pa);
186 }
187
188
189 @Override
190 public Logger getLogger(String name, Class<?> caller) {
191 SecurityManager sm = System.getSecurityManager();
192 if (sm != null) {
193 sm.checkPermission(LOGGERFINDER_PERMISSION);
194 }
195 PrivilegedAction<ClassLoader> pa = () -> caller.getClassLoader();
196 ClassLoader callerLoader = AccessController.doPrivileged(pa);
197 if (callerLoader == null) {
198 return system.computeIfAbsent(name, (n) -> new LoggerImpl(n, createSimpleLogger(name)));
199 } else {
200 return user.computeIfAbsent(name, (n) -> new LoggerImpl(n, createSimpleLogger(name)));
201 }
202 }
203 }
204
205 public static class BaseLoggerFinder2 extends LoggerFinder implements TestLoggerFinder {
206
207 static final RuntimePermission LOGGERFINDER_PERMISSION =
208 new RuntimePermission("loggerFinder");
209 public BaseLoggerFinder2() {
210 throw new ServiceConfigurationError("Should not come here");
211 }
212 @Override
213 public Logger getLogger(String name, Class<?> caller) {
214 throw new ServiceConfigurationError("Should not come here");
215 }
216 }
217
218 public static class MyBundle extends ResourceBundle {
219
220 final ConcurrentHashMap<String,String> map = new ConcurrentHashMap<>();
221
222 @Override
223 protected Object handleGetObject(String key) {
224 if (key.contains(" (translated)")) {
225 throw new RuntimeException("Unexpected key: " + key);
226 }
227 return map.computeIfAbsent(key, k -> k.toUpperCase(Locale.ROOT) + " (translated)");
228 }
229
230 @Override
231 public Enumeration<String> getKeys() {
232 return Collections.enumeration(map.keySet());
233 }
|
36 import java.util.HashMap;
37 import java.util.Map;
38 import java.util.ResourceBundle;
39 import java.util.stream.Stream;
40 import java.util.concurrent.ConcurrentHashMap;
41 import java.util.concurrent.atomic.AtomicBoolean;
42 import java.util.concurrent.atomic.AtomicLong;
43 import java.util.function.Supplier;
44 import java.lang.System.LoggerFinder;
45 import java.lang.System.Logger;
46 import java.lang.System.Logger.Level;
47 import java.security.AccessController;
48 import java.security.PrivilegedAction;
49 import java.util.EnumSet;
50 import java.util.Iterator;
51 import java.util.Locale;
52 import java.util.ServiceConfigurationError;
53 import java.util.ServiceLoader;
54 import java.util.concurrent.atomic.AtomicReference;
55 import jdk.internal.logger.SimpleConsoleLogger;
56 import java.lang.reflect.Module;
57
58 /**
59 * @test
60 * @bug 8140364
61 * @summary JDK implementation specific unit test for LoggerFinderLoader.
62 * Tests the behavior of LoggerFinderLoader with respect to the
63 * value of the internal diagnosability switches. Also test the
64 * DefaultLoggerFinder and SimpleConsoleLogger implementation.
65 * @modules java.base/sun.util.logging
66 * java.base/jdk.internal.logger
67 * @build AccessSystemLogger LoggerFinderLoaderTest CustomSystemClassLoader
68 * @run driver AccessSystemLogger
69 * @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader LoggerFinderLoaderTest NOSECURITY
70 * @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader LoggerFinderLoaderTest NOPERMISSIONS
71 * @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader LoggerFinderLoaderTest WITHPERMISSIONS
72 * @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true LoggerFinderLoaderTest NOSECURITY
73 * @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true LoggerFinderLoaderTest NOPERMISSIONS
74 * @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true LoggerFinderLoaderTest WITHPERMISSIONS
75 * @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true -Djdk.logger.finder.error=ERROR LoggerFinderLoaderTest NOSECURITY
76 * @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true -Djdk.logger.finder.error=ERROR LoggerFinderLoaderTest NOPERMISSIONS
150 return name;
151 }
152
153 @Override
154 public boolean isLoggable(Logger.Level level) {
155 return logger.isLoggable(level);
156 }
157
158 @Override
159 public void log(Logger.Level level, ResourceBundle bundle, String key, Throwable thrown) {
160 logger.log(level, bundle, key, thrown);
161 }
162
163 @Override
164 public void log(Logger.Level level, ResourceBundle bundle, String format, Object... params) {
165 logger.log(level, bundle, format, params);
166 }
167
168 }
169
170 public Logger getLogger(String name, Module caller);
171 public Logger getLocalizedLogger(String name, ResourceBundle bundle, Module caller);
172 }
173
174 public static class BaseLoggerFinder extends LoggerFinder implements TestLoggerFinder {
175
176 static final RuntimePermission LOGGERFINDER_PERMISSION =
177 new RuntimePermission("loggerFinder");
178 public BaseLoggerFinder() {
179 if (fails.get()) {
180 throw new RuntimeException("Simulate exception while loading provider");
181 }
182 }
183
184 System.Logger createSimpleLogger(String name) {
185 PrivilegedAction<System.Logger> pa = () -> SimpleConsoleLogger.makeSimpleLogger(name);
186 return AccessController.doPrivileged(pa);
187 }
188
189
190 @Override
191 public Logger getLogger(String name, Module caller) {
192 SecurityManager sm = System.getSecurityManager();
193 if (sm != null) {
194 sm.checkPermission(LOGGERFINDER_PERMISSION);
195 }
196 PrivilegedAction<ClassLoader> pa = () -> caller.getClassLoader();
197 ClassLoader callerLoader = AccessController.doPrivileged(pa);
198 if (callerLoader == null) {
199 return system.computeIfAbsent(name, (n) -> new LoggerImpl(n, createSimpleLogger(name)));
200 } else {
201 return user.computeIfAbsent(name, (n) -> new LoggerImpl(n, createSimpleLogger(name)));
202 }
203 }
204 }
205
206 public static class BaseLoggerFinder2 extends LoggerFinder implements TestLoggerFinder {
207
208 static final RuntimePermission LOGGERFINDER_PERMISSION =
209 new RuntimePermission("loggerFinder");
210 public BaseLoggerFinder2() {
211 throw new ServiceConfigurationError("Should not come here");
212 }
213 @Override
214 public Logger getLogger(String name, Module caller) {
215 throw new ServiceConfigurationError("Should not come here");
216 }
217 }
218
219 public static class MyBundle extends ResourceBundle {
220
221 final ConcurrentHashMap<String,String> map = new ConcurrentHashMap<>();
222
223 @Override
224 protected Object handleGetObject(String key) {
225 if (key.contains(" (translated)")) {
226 throw new RuntimeException("Unexpected key: " + key);
227 }
228 return map.computeIfAbsent(key, k -> k.toUpperCase(Locale.ROOT) + " (translated)");
229 }
230
231 @Override
232 public Enumeration<String> getKeys() {
233 return Collections.enumeration(map.keySet());
234 }
|