Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/test/jdk/java/lang/System/LoggerFinder/internal/LoggerFinderLoaderTest/LoggerFinderLoaderTest.java
41161 views
1
/*
2
* Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*/
23
import java.io.ByteArrayOutputStream;
24
import java.io.IOException;
25
import java.io.PrintStream;
26
import java.io.UncheckedIOException;
27
import java.security.AccessControlException;
28
import java.security.CodeSource;
29
import java.security.Permission;
30
import java.security.PermissionCollection;
31
import java.security.Permissions;
32
import java.security.Policy;
33
import java.security.ProtectionDomain;
34
import java.util.Collections;
35
import java.util.Enumeration;
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 8189291
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 BaseLoggerFinder BaseLoggerFinder2
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.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader LoggerFinderLoaderTest NOPERMISSIONS
70
* @run main/othervm -Xbootclasspath/a:boot -Djava.security.manager=allow -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.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true LoggerFinderLoaderTest NOPERMISSIONS
73
* @run main/othervm -Xbootclasspath/a:boot -Djava.security.manager=allow -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.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true -Djdk.logger.finder.error=ERROR LoggerFinderLoaderTest NOPERMISSIONS
76
* @run main/othervm -Xbootclasspath/a:boot -Djava.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true -Djdk.logger.finder.error=ERROR LoggerFinderLoaderTest WITHPERMISSIONS
77
* @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true -Djdk.logger.finder.error=DEBUG LoggerFinderLoaderTest NOSECURITY
78
* @run main/othervm -Xbootclasspath/a:boot -Djava.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true -Djdk.logger.finder.error=DEBUG LoggerFinderLoaderTest NOPERMISSIONS
79
* @run main/othervm -Xbootclasspath/a:boot -Djava.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true -Djdk.logger.finder.error=DEBUG LoggerFinderLoaderTest WITHPERMISSIONS
80
* @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true -Djdk.logger.finder.error=QUIET LoggerFinderLoaderTest NOSECURITY
81
* @run main/othervm -Xbootclasspath/a:boot -Djava.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true -Djdk.logger.finder.error=QUIET LoggerFinderLoaderTest NOPERMISSIONS
82
* @run main/othervm -Xbootclasspath/a:boot -Djava.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader -Dtest.fails=true -Djdk.logger.finder.error=QUIET LoggerFinderLoaderTest WITHPERMISSIONS
83
* @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader -Djdk.logger.finder.singleton=true LoggerFinderLoaderTest NOSECURITY
84
* @run main/othervm -Xbootclasspath/a:boot -Djava.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader -Djdk.logger.finder.singleton=true LoggerFinderLoaderTest NOPERMISSIONS
85
* @run main/othervm -Xbootclasspath/a:boot -Djava.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader -Djdk.logger.finder.singleton=true LoggerFinderLoaderTest WITHPERMISSIONS
86
* @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader -Djdk.logger.finder.singleton=true -Djdk.logger.finder.error=ERROR LoggerFinderLoaderTest NOSECURITY
87
* @run main/othervm -Xbootclasspath/a:boot -Djava.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader -Djdk.logger.finder.singleton=true -Djdk.logger.finder.error=ERROR LoggerFinderLoaderTest NOPERMISSIONS
88
* @run main/othervm -Xbootclasspath/a:boot -Djava.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader -Djdk.logger.finder.singleton=true -Djdk.logger.finder.error=ERROR LoggerFinderLoaderTest WITHPERMISSIONS
89
* @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader -Djdk.logger.finder.singleton=true -Djdk.logger.finder.error=DEBUG LoggerFinderLoaderTest NOSECURITY
90
* @run main/othervm -Xbootclasspath/a:boot -Djava.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader -Djdk.logger.finder.singleton=true -Djdk.logger.finder.error=DEBUG LoggerFinderLoaderTest NOPERMISSIONS
91
* @run main/othervm -Xbootclasspath/a:boot -Djava.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader -Djdk.logger.finder.singleton=true -Djdk.logger.finder.error=DEBUG LoggerFinderLoaderTest WITHPERMISSIONS
92
* @run main/othervm -Xbootclasspath/a:boot -Djava.system.class.loader=CustomSystemClassLoader -Djdk.logger.finder.singleton=true -Djdk.logger.finder.error=QUIET LoggerFinderLoaderTest NOSECURITY
93
* @run main/othervm -Xbootclasspath/a:boot -Djava.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader -Djdk.logger.finder.singleton=true -Djdk.logger.finder.error=QUIET LoggerFinderLoaderTest NOPERMISSIONS
94
* @run main/othervm -Xbootclasspath/a:boot -Djava.security.manager=allow -Djava.system.class.loader=CustomSystemClassLoader -Djdk.logger.finder.singleton=true -Djdk.logger.finder.error=QUIET LoggerFinderLoaderTest WITHPERMISSIONS
95
* @author danielfuchs
96
*/
97
public class LoggerFinderLoaderTest {
98
99
static final Policy DEFAULT_POLICY = Policy.getPolicy();
100
static final RuntimePermission LOGGERFINDER_PERMISSION =
101
new RuntimePermission("loggerFinder");
102
final static boolean VERBOSE = false;
103
static final ThreadLocal<AtomicBoolean> allowControl = new ThreadLocal<AtomicBoolean>() {
104
@Override
105
protected AtomicBoolean initialValue() {
106
return new AtomicBoolean(false);
107
}
108
};
109
static final ThreadLocal<AtomicBoolean> allowAccess = new ThreadLocal<AtomicBoolean>() {
110
@Override
111
protected AtomicBoolean initialValue() {
112
return new AtomicBoolean(false);
113
}
114
};
115
116
final static AccessSystemLogger accessSystemLogger = new AccessSystemLogger();
117
static final Class<?>[] providerClass;
118
static {
119
try {
120
providerClass = new Class<?>[] {
121
ClassLoader.getSystemClassLoader().loadClass("BaseLoggerFinder"),
122
ClassLoader.getSystemClassLoader().loadClass("BaseLoggerFinder2")
123
};
124
} catch (ClassNotFoundException ex) {
125
throw new ExceptionInInitializerError(ex);
126
}
127
}
128
129
/**
130
* What our test provider needs to implement.
131
*/
132
public static interface TestLoggerFinder {
133
public final static AtomicBoolean fails = new AtomicBoolean();
134
public final static AtomicReference<String> conf = new AtomicReference<>("");
135
public final static AtomicLong sequencer = new AtomicLong();
136
public final ConcurrentHashMap<String, LoggerImpl> system = new ConcurrentHashMap<>();
137
public final ConcurrentHashMap<String, LoggerImpl> user = new ConcurrentHashMap<>();
138
139
public class LoggerImpl implements System.Logger {
140
final String name;
141
final Logger logger;
142
143
public LoggerImpl(String name, Logger logger) {
144
this.name = name;
145
this.logger = logger;
146
}
147
148
@Override
149
public String getName() {
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 MyBundle extends ResourceBundle {
175
176
final ConcurrentHashMap<String,String> map = new ConcurrentHashMap<>();
177
178
@Override
179
protected Object handleGetObject(String key) {
180
if (key.contains(" (translated)")) {
181
throw new RuntimeException("Unexpected key: " + key);
182
}
183
return map.computeIfAbsent(key, k -> k.toUpperCase(Locale.ROOT) + " (translated)");
184
}
185
186
@Override
187
public Enumeration<String> getKeys() {
188
return Collections.enumeration(map.keySet());
189
}
190
191
}
192
public static class MyLoggerBundle extends MyBundle {
193
194
}
195
196
static enum TestCases {NOSECURITY, NOPERMISSIONS, WITHPERMISSIONS};
197
198
static void setSecurityManager() {
199
if (System.getSecurityManager() == null) {
200
Policy.setPolicy(new SimplePolicy(allowControl, allowAccess));
201
System.setSecurityManager(new SecurityManager());
202
}
203
}
204
205
static LoggerFinder getLoggerFinder(Class<?> expectedClass,
206
String errorPolicy, boolean singleton) {
207
LoggerFinder provider = null;
208
try {
209
TestLoggerFinder.sequencer.incrementAndGet();
210
provider = LoggerFinder.getLoggerFinder();
211
if (TestLoggerFinder.fails.get() || singleton) {
212
if ("ERROR".equals(errorPolicy.toUpperCase(Locale.ROOT))) {
213
throw new RuntimeException("Expected exception not thrown");
214
} else if ("WARNING".equals(errorPolicy.toUpperCase(Locale.ROOT))) {
215
String warning = ErrorStream.errorStream.peek();
216
if (!warning.contains("WARNING: Failed to instantiate LoggerFinder provider; Using default.")) {
217
throw new RuntimeException("Expected message not found. Error stream contained: " + warning);
218
}
219
} else if ("DEBUG".equals(errorPolicy.toUpperCase(Locale.ROOT))) {
220
String warning = ErrorStream.errorStream.peek();
221
if (!warning.contains("WARNING: Failed to instantiate LoggerFinder provider; Using default.")) {
222
throw new RuntimeException("Expected message not found. Error stream contained: " + warning);
223
}
224
if (!warning.contains("WARNING: Exception raised trying to instantiate LoggerFinder")) {
225
throw new RuntimeException("Expected message not found. Error stream contained: " + warning);
226
}
227
if (TestLoggerFinder.fails.get()) {
228
if (!warning.contains("java.util.ServiceConfigurationError: java.lang.System$LoggerFinder: Provider BaseLoggerFinder could not be instantiated")) {
229
throw new RuntimeException("Expected message not found. Error stream contained: " + warning);
230
}
231
} else if (singleton) {
232
if (!warning.contains("java.util.ServiceConfigurationError: More than on LoggerFinder implementation")) {
233
throw new RuntimeException("Expected message not found. Error stream contained: " + warning);
234
}
235
}
236
} else if ("QUIET".equals(errorPolicy.toUpperCase(Locale.ROOT))) {
237
String warning = ErrorStream.errorStream.peek();
238
String smDeprecationWarning
239
= "WARNING: java.lang.System::setSecurityManager is deprecated and will be removed in a future release."
240
+ System.getProperty("line.separator");
241
if (warning.startsWith(smDeprecationWarning)) {
242
warning = warning.substring(smDeprecationWarning.length());
243
}
244
if (!warning.isEmpty()) {
245
throw new RuntimeException("Unexpected error message found: "
246
+ ErrorStream.errorStream.peek());
247
}
248
}
249
}
250
} catch(AccessControlException a) {
251
throw a;
252
} catch(Throwable t) {
253
if (TestLoggerFinder.fails.get() || singleton) {
254
// must check System.err
255
if ("ERROR".equals(errorPolicy.toUpperCase(Locale.ROOT))) {
256
provider = LoggerFinder.getLoggerFinder();
257
} else {
258
Throwable orig = t.getCause();
259
while (orig != null && orig.getCause() != null) orig = orig.getCause();
260
if (orig != null) orig.printStackTrace(ErrorStream.err);
261
throw new RuntimeException("Unexpected exception: " + t, t);
262
}
263
} else {
264
throw new RuntimeException("Unexpected exception: " + t, t);
265
}
266
}
267
expectedClass.cast(provider);
268
ErrorStream.errorStream.store();
269
System.out.println("*** Actual LoggerFinder class is: " + provider.getClass().getName());
270
return provider;
271
}
272
273
274
static class ErrorStream extends PrintStream {
275
276
static AtomicBoolean forward = new AtomicBoolean();
277
ByteArrayOutputStream out;
278
String saved = "";
279
public ErrorStream(ByteArrayOutputStream out) {
280
super(out);
281
this.out = out;
282
}
283
284
@Override
285
public void write(int b) {
286
super.write(b);
287
if (forward.get()) err.write(b);
288
}
289
290
@Override
291
public void write(byte[] b) throws IOException {
292
super.write(b);
293
if (forward.get()) err.write(b);
294
}
295
296
@Override
297
public void write(byte[] buf, int off, int len) {
298
super.write(buf, off, len);
299
if (forward.get()) err.write(buf, off, len);
300
}
301
302
public String peek() {
303
flush();
304
return out.toString();
305
}
306
307
public String drain() {
308
flush();
309
String res = out.toString();
310
out.reset();
311
return res;
312
}
313
314
public void store() {
315
flush();
316
saved = out.toString();
317
out.reset();
318
}
319
320
public void restore() {
321
out.reset();
322
try {
323
out.write(saved.getBytes());
324
} catch(IOException io) {
325
throw new UncheckedIOException(io);
326
}
327
}
328
329
static final PrintStream err = System.err;
330
static final ErrorStream errorStream = new ErrorStream(new ByteArrayOutputStream());
331
}
332
333
private static StringBuilder appendProperty(StringBuilder b, String name) {
334
String value = System.getProperty(name);
335
if (value == null) return b;
336
return b.append(name).append("=").append(value).append('\n');
337
}
338
339
public static void main(String[] args) {
340
if (args.length == 0) {
341
args = new String[] {
342
"NOSECURITY",
343
"NOPERMISSIONS",
344
"WITHPERMISSIONS"
345
};
346
}
347
Locale.setDefault(Locale.ENGLISH);
348
System.setErr(ErrorStream.errorStream);
349
System.setProperty("jdk.logger.packages", TestLoggerFinder.LoggerImpl.class.getName());
350
//System.setProperty("jdk.logger.finder.error", "ERROR");
351
//System.setProperty("jdk.logger.finder.singleton", "true");
352
//System.setProperty("test.fails", "true");
353
TestLoggerFinder.fails.set(Boolean.getBoolean("test.fails"));
354
StringBuilder c = new StringBuilder();
355
appendProperty(c, "jdk.logger.packages");
356
appendProperty(c, "jdk.logger.finder.error");
357
appendProperty(c, "jdk.logger.finder.singleton");
358
appendProperty(c, "test.fails");
359
TestLoggerFinder.conf.set(c.toString());
360
try {
361
test(args);
362
} finally {
363
try {
364
System.setErr(ErrorStream.err);
365
} catch (Error | RuntimeException x) {
366
x.printStackTrace(ErrorStream.err);
367
}
368
}
369
}
370
371
372
public static void test(String[] args) {
373
374
final String errorPolicy = System.getProperty("jdk.logger.finder.error", "WARNING");
375
final Boolean ensureSingleton = Boolean.getBoolean("jdk.logger.finder.singleton");
376
377
final Class<?> expectedClass =
378
TestLoggerFinder.fails.get() || ensureSingleton
379
? jdk.internal.logger.DefaultLoggerFinder.class
380
: TestLoggerFinder.class;
381
382
System.out.println("Declared provider class: " + providerClass[0]
383
+ "[" + providerClass[0].getClassLoader() + "]");
384
385
if (!TestLoggerFinder.fails.get()) {
386
ServiceLoader<LoggerFinder> serviceLoader =
387
ServiceLoader.load(LoggerFinder.class, ClassLoader.getSystemClassLoader());
388
Iterator<LoggerFinder> iterator = serviceLoader.iterator();
389
Object firstProvider = iterator.next();
390
if (!firstProvider.getClass().getName().equals("BaseLoggerFinder")) {
391
throw new RuntimeException("Unexpected provider: " + firstProvider.getClass().getName());
392
}
393
if (!iterator.hasNext()) {
394
throw new RuntimeException("Expected two providers");
395
}
396
}
397
398
Stream.of(args).map(TestCases::valueOf).forEach((testCase) -> {
399
LoggerFinder provider;
400
ErrorStream.errorStream.restore();
401
switch (testCase) {
402
case NOSECURITY:
403
System.out.println("\n*** Without Security Manager\n");
404
System.out.println(TestLoggerFinder.conf.get());
405
provider = getLoggerFinder(expectedClass, errorPolicy, ensureSingleton);
406
test(provider, true);
407
System.out.println("Tetscase count: " + TestLoggerFinder.sequencer.get());
408
break;
409
case NOPERMISSIONS:
410
System.out.println("\n*** With Security Manager, without permissions\n");
411
System.out.println(TestLoggerFinder.conf.get());
412
setSecurityManager();
413
try {
414
provider = getLoggerFinder(expectedClass, errorPolicy, ensureSingleton);
415
throw new RuntimeException("Expected exception not raised");
416
} catch (AccessControlException x) {
417
if (!LOGGERFINDER_PERMISSION.equals(x.getPermission())) {
418
throw new RuntimeException("Unexpected permission check", x);
419
}
420
final boolean control = allowControl.get().get();
421
try {
422
allowControl.get().set(true);
423
provider = getLoggerFinder(expectedClass, errorPolicy, ensureSingleton);
424
} finally {
425
allowControl.get().set(control);
426
}
427
}
428
test(provider, false);
429
System.out.println("Tetscase count: " + TestLoggerFinder.sequencer.get());
430
break;
431
case WITHPERMISSIONS:
432
System.out.println("\n*** With Security Manager, with control permission\n");
433
System.out.println(TestLoggerFinder.conf.get());
434
setSecurityManager();
435
final boolean control = allowControl.get().get();
436
try {
437
allowControl.get().set(true);
438
provider = getLoggerFinder(expectedClass, errorPolicy, ensureSingleton);
439
test(provider, true);
440
} finally {
441
allowControl.get().set(control);
442
}
443
break;
444
default:
445
throw new RuntimeException("Unknown test case: " + testCase);
446
}
447
});
448
System.out.println("\nPASSED: Tested " + TestLoggerFinder.sequencer.get() + " cases.");
449
}
450
451
public static void test(LoggerFinder provider, boolean hasRequiredPermissions) {
452
453
ResourceBundle loggerBundle = ResourceBundle.getBundle(MyLoggerBundle.class.getName());
454
final Map<Logger, String> loggerDescMap = new HashMap<>();
455
456
System.Logger sysLogger = accessSystemLogger.getLogger("foo");
457
loggerDescMap.put(sysLogger, "accessSystemLogger.getLogger(\"foo\")");
458
System.Logger localizedSysLogger = accessSystemLogger.getLogger("fox", loggerBundle);
459
loggerDescMap.put(localizedSysLogger, "accessSystemLogger.getLogger(\"fox\", loggerBundle)");
460
System.Logger appLogger = System.getLogger("bar");
461
loggerDescMap.put(appLogger,"System.getLogger(\"bar\")");
462
System.Logger localizedAppLogger = System.getLogger("baz", loggerBundle);
463
loggerDescMap.put(localizedAppLogger,"System.getLogger(\"baz\", loggerBundle)");
464
465
testLogger(provider, loggerDescMap, "foo", null, sysLogger);
466
testLogger(provider, loggerDescMap, "foo", loggerBundle, localizedSysLogger);
467
testLogger(provider, loggerDescMap, "foo", null, appLogger);
468
testLogger(provider, loggerDescMap, "foo", loggerBundle, localizedAppLogger);
469
}
470
471
public static class Foo {
472
473
}
474
475
static void verbose(String msg) {
476
if (VERBOSE) {
477
System.out.println(msg);
478
}
479
}
480
481
// Calls the 8 methods defined on Logger and verify the
482
// parameters received by the underlying TestProvider.LoggerImpl
483
// logger.
484
private static void testLogger(LoggerFinder provider,
485
Map<Logger, String> loggerDescMap,
486
String name,
487
ResourceBundle loggerBundle,
488
Logger logger) {
489
490
System.out.println("Testing " + loggerDescMap.get(logger) + " [" + logger +"]");
491
AtomicLong sequencer = TestLoggerFinder.sequencer;
492
493
Foo foo = new Foo();
494
String fooMsg = foo.toString();
495
for (Level loggerLevel : EnumSet.of(Level.INFO)) {
496
for (Level messageLevel : Level.values()) {
497
ErrorStream.errorStream.drain();
498
String desc = "logger.log(messageLevel, foo): loggerLevel="
499
+ loggerLevel+", messageLevel="+messageLevel;
500
sequencer.incrementAndGet();
501
logger.log(messageLevel, foo);
502
if (loggerLevel == Level.OFF || messageLevel == Level.OFF || messageLevel.compareTo(loggerLevel) < 0) {
503
if (!ErrorStream.errorStream.peek().isEmpty()) {
504
throw new RuntimeException("unexpected event in queue for "
505
+ desc +": " + "\n\t" + ErrorStream.errorStream.drain());
506
}
507
} else {
508
String logged = ErrorStream.errorStream.drain();
509
if (!logged.contains("LoggerFinderLoaderTest testLogger")
510
|| !logged.contains(messageLevel.getName() + ": " + fooMsg)) {
511
throw new RuntimeException("mismatch for " + desc
512
+ "\n\texpected:" + "\n<<<<\n"
513
+ "[date] LoggerFinderLoaderTest testLogger\n"
514
+ messageLevel.getName() + " " + fooMsg
515
+ "\n>>>>"
516
+ "\n\t actual:"
517
+ "\n<<<<\n" + logged + ">>>>\n");
518
} else {
519
verbose("Got expected results for "
520
+ desc + "\n<<<<\n" + logged + ">>>>\n");
521
}
522
}
523
}
524
}
525
526
String msg = "blah";
527
for (Level loggerLevel : EnumSet.of(Level.INFO)) {
528
for (Level messageLevel : Level.values()) {
529
String desc = "logger.log(messageLevel, \"blah\"): loggerLevel="
530
+ loggerLevel+", messageLevel="+messageLevel;
531
sequencer.incrementAndGet();
532
logger.log(messageLevel, msg);
533
if (loggerLevel == Level.OFF || messageLevel == Level.OFF || messageLevel.compareTo(loggerLevel) < 0) {
534
if (!ErrorStream.errorStream.peek().isEmpty()) {
535
throw new RuntimeException("unexpected event in queue for "
536
+ desc +": " + "\n\t" + ErrorStream.errorStream.drain());
537
}
538
} else {
539
String logged = ErrorStream.errorStream.drain();
540
String msgText = loggerBundle == null ? msg : loggerBundle.getString(msg);
541
if (!logged.contains("LoggerFinderLoaderTest testLogger")
542
|| !logged.contains(messageLevel.getName() + ": " + msgText)) {
543
throw new RuntimeException("mismatch for " + desc
544
+ "\n\texpected:" + "\n<<<<\n"
545
+ "[date] LoggerFinderLoaderTest testLogger\n"
546
+ messageLevel.getName() + " " + msgText
547
+ "\n>>>>"
548
+ "\n\t actual:"
549
+ "\n<<<<\n" + logged + ">>>>\n");
550
} else {
551
verbose("Got expected results for "
552
+ desc + "\n<<<<\n" + logged + ">>>>\n");
553
}
554
}
555
}
556
}
557
558
Supplier<String> fooSupplier = new Supplier<String>() {
559
@Override
560
public String get() {
561
return this.toString();
562
}
563
};
564
565
for (Level loggerLevel : EnumSet.of(Level.INFO)) {
566
for (Level messageLevel : Level.values()) {
567
String desc = "logger.log(messageLevel, fooSupplier): loggerLevel="
568
+ loggerLevel+", messageLevel="+messageLevel;
569
sequencer.incrementAndGet();
570
logger.log(messageLevel, fooSupplier);
571
if (loggerLevel == Level.OFF || messageLevel == Level.OFF || messageLevel.compareTo(loggerLevel) < 0) {
572
if (!ErrorStream.errorStream.peek().isEmpty()) {
573
throw new RuntimeException("unexpected event in queue for "
574
+ desc +": " + "\n\t" + ErrorStream.errorStream.drain());
575
}
576
} else {
577
String logged = ErrorStream.errorStream.drain();
578
if (!logged.contains("LoggerFinderLoaderTest testLogger")
579
|| !logged.contains(messageLevel.getName() + ": " + fooSupplier.get())) {
580
throw new RuntimeException("mismatch for " + desc
581
+ "\n\texpected:" + "\n<<<<\n"
582
+ "[date] LoggerFinderLoaderTest testLogger\n"
583
+ messageLevel.getName() + " " + fooSupplier.get()
584
+ "\n>>>>"
585
+ "\n\t actual:"
586
+ "\n<<<<\n" + logged + ">>>>\n");
587
} else {
588
verbose("Got expected results for "
589
+ desc + "\n<<<<\n" + logged + ">>>>\n");
590
}
591
}
592
}
593
}
594
595
596
String format = "two params [{1} {2}]";
597
Object arg1 = foo;
598
Object arg2 = msg;
599
for (Level loggerLevel : EnumSet.of(Level.INFO)) {
600
for (Level messageLevel : Level.values()) {
601
String desc = "logger.log(messageLevel, format, params...): loggerLevel="
602
+ loggerLevel+", messageLevel="+messageLevel;
603
sequencer.incrementAndGet();
604
logger.log(messageLevel, format, foo, msg);
605
if (loggerLevel == Level.OFF || messageLevel == Level.OFF || messageLevel.compareTo(loggerLevel) < 0) {
606
if (!ErrorStream.errorStream.peek().isEmpty()) {
607
throw new RuntimeException("unexpected event in queue for "
608
+ desc +": " + "\n\t" + ErrorStream.errorStream.drain());
609
}
610
} else {
611
String logged = ErrorStream.errorStream.drain();
612
String msgFormat = loggerBundle == null ? format : loggerBundle.getString(format);
613
String text = java.text.MessageFormat.format(msgFormat, foo, msg);
614
if (!logged.contains("LoggerFinderLoaderTest testLogger")
615
|| !logged.contains(messageLevel.getName() + ": " + text)) {
616
throw new RuntimeException("mismatch for " + desc
617
+ "\n\texpected:" + "\n<<<<\n"
618
+ "[date] LoggerFinderLoaderTest testLogger\n"
619
+ messageLevel.getName() + " " + text
620
+ "\n>>>>"
621
+ "\n\t actual:"
622
+ "\n<<<<\n" + logged + ">>>>\n");
623
} else {
624
verbose("Got expected results for "
625
+ desc + "\n<<<<\n" + logged + ">>>>\n");
626
}
627
}
628
}
629
}
630
631
Throwable thrown = new Exception("OK: log me!");
632
for (Level loggerLevel : EnumSet.of(Level.INFO)) {
633
for (Level messageLevel : Level.values()) {
634
String desc = "logger.log(messageLevel, \"blah\", thrown): loggerLevel="
635
+ loggerLevel+", messageLevel="+messageLevel;
636
sequencer.incrementAndGet();
637
logger.log(messageLevel, msg, thrown);
638
if (loggerLevel == Level.OFF || messageLevel == Level.OFF || messageLevel.compareTo(loggerLevel) < 0) {
639
if (!ErrorStream.errorStream.peek().isEmpty()) {
640
throw new RuntimeException("unexpected event in queue for "
641
+ desc +": " + "\n\t" + ErrorStream.errorStream.drain());
642
}
643
} else {
644
String logged = ErrorStream.errorStream.drain();
645
ByteArrayOutputStream baos = new ByteArrayOutputStream();
646
thrown.printStackTrace(new PrintStream(baos));
647
String text = baos.toString();
648
String msgText = loggerBundle == null ? msg : loggerBundle.getString(msg);
649
if (!logged.contains("LoggerFinderLoaderTest testLogger")
650
|| !logged.contains(messageLevel.getName() + ": " + msgText)
651
|| !logged.contains(text)) {
652
throw new RuntimeException("mismatch for " + desc
653
+ "\n\texpected:" + "\n<<<<\n"
654
+ "[date] LoggerFinderLoaderTest testLogger\n"
655
+ messageLevel.getName() + " " + msgText +"\n"
656
+ text
657
+ ">>>>"
658
+ "\n\t actual:"
659
+ "\n<<<<\n" + logged + ">>>>\n");
660
} else {
661
verbose("Got expected results for "
662
+ desc + "\n<<<<\n" + logged + ">>>>\n");
663
}
664
}
665
}
666
}
667
668
669
for (Level loggerLevel : EnumSet.of(Level.INFO)) {
670
for (Level messageLevel : Level.values()) {
671
String desc = "logger.log(messageLevel, thrown, fooSupplier): loggerLevel="
672
+ loggerLevel+", messageLevel="+messageLevel;
673
sequencer.incrementAndGet();
674
logger.log(messageLevel, fooSupplier, thrown);
675
if (loggerLevel == Level.OFF || messageLevel == Level.OFF || messageLevel.compareTo(loggerLevel) < 0) {
676
if (!ErrorStream.errorStream.peek().isEmpty()) {
677
throw new RuntimeException("unexpected event in queue for "
678
+ desc +": " + "\n\t" + ErrorStream.errorStream.drain());
679
}
680
} else {
681
String logged = ErrorStream.errorStream.drain();
682
ByteArrayOutputStream baos = new ByteArrayOutputStream();
683
thrown.printStackTrace(new PrintStream(baos));
684
String text = baos.toString();
685
if (!logged.contains("LoggerFinderLoaderTest testLogger")
686
|| !logged.contains(messageLevel.getName() + ": " + fooSupplier.get())
687
|| !logged.contains(text)) {
688
throw new RuntimeException("mismatch for " + desc
689
+ "\n\texpected:" + "\n<<<<\n"
690
+ "[date] LoggerFinderLoaderTest testLogger\n"
691
+ messageLevel.getName() + " " + fooSupplier.get() +"\n"
692
+ text
693
+ ">>>>"
694
+ "\n\t actual:"
695
+ "\n<<<<\n" + logged + ">>>>\n");
696
} else {
697
verbose("Got expected results for "
698
+ desc + "\n<<<<\n" + logged + ">>>>\n");
699
}
700
}
701
}
702
}
703
704
ResourceBundle bundle = ResourceBundle.getBundle(MyBundle.class.getName());
705
for (Level loggerLevel : EnumSet.of(Level.INFO)) {
706
for (Level messageLevel : Level.values()) {
707
String desc = "logger.log(messageLevel, bundle, format, params...): loggerLevel="
708
+ loggerLevel+", messageLevel="+messageLevel;
709
sequencer.incrementAndGet();
710
logger.log(messageLevel, bundle, format, foo, msg);
711
if (loggerLevel == Level.OFF || messageLevel == Level.OFF || messageLevel.compareTo(loggerLevel) < 0) {
712
if (!ErrorStream.errorStream.peek().isEmpty()) {
713
throw new RuntimeException("unexpected event in queue for "
714
+ desc +": " + "\n\t" + ErrorStream.errorStream.drain());
715
}
716
} else {
717
String logged = ErrorStream.errorStream.drain();
718
String text = java.text.MessageFormat.format(bundle.getString(format), foo, msg);
719
if (!logged.contains("LoggerFinderLoaderTest testLogger")
720
|| !logged.contains(messageLevel.getName() + ": " + text)) {
721
throw new RuntimeException("mismatch for " + desc
722
+ "\n\texpected:" + "\n<<<<\n"
723
+ "[date] LoggerFinderLoaderTest testLogger\n"
724
+ messageLevel.getName() + " " + text
725
+ "\n>>>>"
726
+ "\n\t actual:"
727
+ "\n<<<<\n" + logged + ">>>>\n");
728
} else {
729
verbose("Got expected results for "
730
+ desc + "\n<<<<\n" + logged + ">>>>\n");
731
}
732
}
733
}
734
}
735
736
for (Level loggerLevel : EnumSet.of(Level.INFO)) {
737
for (Level messageLevel : Level.values()) {
738
String desc = "logger.log(messageLevel, bundle, \"blah\", thrown): loggerLevel="
739
+ loggerLevel+", messageLevel="+messageLevel;
740
sequencer.incrementAndGet();
741
logger.log(messageLevel, bundle, msg, thrown);
742
if (loggerLevel == Level.OFF || messageLevel == Level.OFF || messageLevel.compareTo(loggerLevel) < 0) {
743
if (!ErrorStream.errorStream.peek().isEmpty()) {
744
throw new RuntimeException("unexpected event in queue for "
745
+ desc +": " + "\n\t" + ErrorStream.errorStream.drain());
746
}
747
} else {
748
String logged = ErrorStream.errorStream.drain();
749
String textMsg = bundle.getString(msg);
750
ByteArrayOutputStream baos = new ByteArrayOutputStream();
751
thrown.printStackTrace(new PrintStream(baos));
752
String text = baos.toString();
753
if (!logged.contains("LoggerFinderLoaderTest testLogger")
754
|| !logged.contains(messageLevel.getName() + ": " + textMsg)
755
|| !logged.contains(text)) {
756
throw new RuntimeException("mismatch for " + desc
757
+ "\n\texpected:" + "\n<<<<\n"
758
+ "[date] LoggerFinderLoaderTest testLogger\n"
759
+ messageLevel.getName() + " " + textMsg +"\n"
760
+ text
761
+ ">>>>"
762
+ "\n\t actual:"
763
+ "\n<<<<\n" + logged + ">>>>\n");
764
} else {
765
verbose("Got expected results for "
766
+ desc + "\n<<<<\n" + logged + ">>>>\n");
767
}
768
}
769
}
770
}
771
772
}
773
774
final static class PermissionsBuilder {
775
final Permissions perms;
776
public PermissionsBuilder() {
777
this(new Permissions());
778
}
779
public PermissionsBuilder(Permissions perms) {
780
this.perms = perms;
781
}
782
public PermissionsBuilder add(Permission p) {
783
perms.add(p);
784
return this;
785
}
786
public PermissionsBuilder addAll(PermissionCollection col) {
787
if (col != null) {
788
for (Enumeration<Permission> e = col.elements(); e.hasMoreElements(); ) {
789
perms.add(e.nextElement());
790
}
791
}
792
return this;
793
}
794
public Permissions toPermissions() {
795
final PermissionsBuilder builder = new PermissionsBuilder();
796
builder.addAll(perms);
797
return builder.perms;
798
}
799
}
800
801
public static class SimplePolicy extends Policy {
802
final static RuntimePermission CONTROL = LOGGERFINDER_PERMISSION;
803
final static RuntimePermission ACCESS = new RuntimePermission("accessClassInPackage.jdk.internal.logger");
804
805
final Permissions permissions;
806
final ThreadLocal<AtomicBoolean> allowControl;
807
final ThreadLocal<AtomicBoolean> allowAccess;
808
public SimplePolicy(ThreadLocal<AtomicBoolean> allowControl, ThreadLocal<AtomicBoolean> allowAccess) {
809
this.allowControl = allowControl;
810
this.allowAccess = allowAccess;
811
permissions = new Permissions();
812
permissions.add(new RuntimePermission("setIO"));
813
}
814
815
Permissions getPermissions() {
816
if (allowControl.get().get() || allowAccess.get().get()) {
817
PermissionsBuilder builder = new PermissionsBuilder()
818
.addAll(permissions);
819
if (allowControl.get().get()) {
820
builder.add(CONTROL);
821
}
822
if (allowAccess.get().get()) {
823
builder.add(ACCESS);
824
}
825
return builder.toPermissions();
826
}
827
return permissions;
828
}
829
830
@Override
831
public boolean implies(ProtectionDomain domain, Permission permission) {
832
return getPermissions().implies(permission) ||
833
DEFAULT_POLICY.implies(domain, permission);
834
}
835
836
@Override
837
public PermissionCollection getPermissions(CodeSource codesource) {
838
return new PermissionsBuilder().addAll(getPermissions()).toPermissions();
839
}
840
841
@Override
842
public PermissionCollection getPermissions(ProtectionDomain domain) {
843
return new PermissionsBuilder().addAll(getPermissions()).toPermissions();
844
}
845
}
846
}
847
848