8
8
9
9
package org .elasticsearch .common .logging ;
10
10
11
+ import org .apache .logging .log4j .Level ;
11
12
import org .apache .logging .log4j .LogManager ;
13
+ import org .apache .logging .log4j .core .Logger ;
12
14
import org .apache .logging .log4j .core .LoggerContext ;
15
+ import org .apache .logging .log4j .spi .LoggerContextFactory ;
13
16
import org .elasticsearch .test .ESTestCase ;
17
+ import org .mockito .Mockito ;
18
+
19
+ import java .security .AccessControlContext ;
20
+ import java .security .AccessController ;
21
+ import java .security .Permissions ;
22
+ import java .security .PrivilegedAction ;
23
+ import java .security .ProtectionDomain ;
24
+ import java .util .concurrent .atomic .AtomicBoolean ;
14
25
15
26
import static org .hamcrest .Matchers .equalTo ;
27
+ import static org .hamcrest .Matchers .is ;
28
+ import static org .mockito .ArgumentMatchers .any ;
29
+ import static org .mockito .ArgumentMatchers .anyBoolean ;
30
+ import static org .mockito .ArgumentMatchers .anyString ;
31
+ import static org .mockito .ArgumentMatchers .eq ;
32
+ import static org .mockito .Mockito .doAnswer ;
33
+ import static org .mockito .Mockito .mock ;
34
+ import static org .mockito .Mockito .when ;
16
35
17
36
public class DeprecationLoggerTests extends ESTestCase {
18
37
19
38
public void testMultipleSlowLoggersUseSingleLog4jLogger () {
20
- LoggerContext context = (LoggerContext ) LogManager .getContext (false );
39
+ org . apache . logging . log4j . core . LoggerContext context = (org . apache . logging . log4j . core . LoggerContext ) LogManager .getContext (false );
21
40
22
41
DeprecationLogger deprecationLogger = DeprecationLogger .getLogger (DeprecationLoggerTests .class );
23
42
int numberOfLoggersBefore = context .getLoggers ().size ();
@@ -30,4 +49,41 @@ class LoggerTest {}
30
49
31
50
assertThat (numberOfLoggersAfter , equalTo (numberOfLoggersBefore + 1 ));
32
51
}
52
+
53
+ public void testLogPermissions () {
54
+ final LoggerContextFactory originalFactory = LogManager .getFactory ();
55
+ try {
56
+ AtomicBoolean supplierCalled = new AtomicBoolean (false );
57
+ // mocking the logger used inside DeprecationLogger requires heavy hacking...
58
+
59
+ Logger mockLogger = mock (Logger .class );
60
+ doAnswer (invocationOnMock -> {
61
+ supplierCalled .set (true );
62
+ createTempDir (); // trigger file permission, like rolling logs would
63
+ return null ;
64
+ }).when (mockLogger ).log (eq (Level .WARN ), any (ESLogMessage .class ));
65
+
66
+ final LoggerContext context = Mockito .mock (LoggerContext .class );
67
+ when (context .getLogger (anyString ())).thenReturn (mockLogger );
68
+
69
+ // "extending" the existing factory to avoid creating new one which
70
+ // would result in LoaderUtil.getParent SM permission exception
71
+ final LoggerContextFactory spy = Mockito .spy (originalFactory );
72
+ Mockito .doReturn (context ).when (spy ).getContext (any (), any (), any (), anyBoolean (), any (), any ());
73
+ LogManager .setFactory (spy );
74
+
75
+ DeprecationLogger deprecationLogger = DeprecationLogger .getLogger ("name" );
76
+
77
+ AccessControlContext noPermissionsAcc = new AccessControlContext (
78
+ new ProtectionDomain [] { new ProtectionDomain (null , new Permissions ()) }
79
+ );
80
+ AccessController .doPrivileged ((PrivilegedAction <Void >) () -> {
81
+ deprecationLogger .warn (DeprecationCategory .API , "key" , "foo" , "bar" );
82
+ return null ;
83
+ }, noPermissionsAcc );
84
+ assertThat ("supplier called" , supplierCalled .get (), is (true ));
85
+ } finally {
86
+ LogManager .setFactory (originalFactory );
87
+ }
88
+ }
33
89
}
0 commit comments