Skip to content

Commit 8bc1ae7

Browse files
committed
TestAppender change to per test. add LoggingTest.
1 parent a7f5a5e commit 8bc1ae7

File tree

5 files changed

+216
-47
lines changed

5 files changed

+216
-47
lines changed

oauth2_http/java/com/google/auth/oauth2/LoggingUtils.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ private LoggingUtils() {}
4949

5050
static void logWithMDC(
5151
Logger logger, org.slf4j.event.Level level, Map<String, String> contextMap, String message) {
52-
contextMap.forEach(MDC::put);
52+
if (!contextMap.isEmpty()) {
53+
contextMap.forEach(MDC::put);
54+
}
5355
switch (level) {
5456
case TRACE:
5557
logger.trace(message);
@@ -70,7 +72,9 @@ static void logWithMDC(
7072
logger.info(message);
7173
// Default to INFO level
7274
}
73-
MDC.clear();
75+
if (!contextMap.isEmpty()) {
76+
MDC.clear();
77+
}
7478
}
7579

7680
static void logRequest(HttpRequest request, Logger logger, String message) {

oauth2_http/javatests/com/google/auth/TestAppender.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
/** Logback appender used to set up tests. */
4040
public class TestAppender extends AppenderBase<ILoggingEvent> {
41-
public static List<ILoggingEvent> events = new ArrayList<>();
41+
public List<ILoggingEvent> events = new ArrayList<>();
4242

4343
@Override
4444
protected void append(ILoggingEvent eventObject) {
@@ -47,7 +47,7 @@ protected void append(ILoggingEvent eventObject) {
4747
events.add(eventObject);
4848
}
4949

50-
public static void clearEvents() {
50+
public void clearEvents() {
5151
events.clear();
5252
}
5353
}
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
/*
2+
* Copyright 2024 Google LLC
3+
*
4+
* Redistribution and use in source and binary forms, with or without
5+
* modification, are permitted provided that the following conditions are
6+
* met:
7+
*
8+
* * Redistributions of source code must retain the above copyright
9+
* notice, this list of conditions and the following disclaimer.
10+
* * Redistributions in binary form must reproduce the above
11+
* copyright notice, this list of conditions and the following disclaimer
12+
* in the documentation and/or other materials provided with the
13+
* distribution.
14+
*
15+
* * Neither the name of Google LLC nor the names of its
16+
* contributors may be used to endorse or promote products derived from
17+
* this software without specific prior written permission.
18+
*
19+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30+
*/
31+
32+
package com.google.auth.oauth2;
33+
34+
import static com.google.auth.oauth2.ServiceAccountCredentialsTest.ACCESS_TOKEN;
35+
import static com.google.auth.oauth2.ServiceAccountCredentialsTest.CALL_URI;
36+
import static com.google.auth.oauth2.ServiceAccountCredentialsTest.CLIENT_EMAIL;
37+
import static com.google.auth.oauth2.ServiceAccountCredentialsTest.DEFAULT_ID_TOKEN;
38+
import static com.google.auth.oauth2.ServiceAccountCredentialsTest.SCOPES;
39+
import static com.google.auth.oauth2.ServiceAccountCredentialsTest.createDefaultBuilder;
40+
import static org.junit.Assert.assertEquals;
41+
42+
import ch.qos.logback.classic.LoggerContext;
43+
import com.google.api.client.http.HttpStatusCodes;
44+
import com.google.auth.TestAppender;
45+
import com.google.auth.TestUtils;
46+
import java.io.IOException;
47+
import java.util.List;
48+
import java.util.Map;
49+
import org.junit.After;
50+
import org.junit.Before;
51+
import org.junit.Test;
52+
import org.slf4j.Logger;
53+
import org.slf4j.LoggerFactory;
54+
55+
public class LoggingTest {
56+
57+
private static final Logger LOGGER = LoggerFactory.getLogger(LoggingTest.class);
58+
private TestEnvironmentProvider testEnvironmentProvider;
59+
60+
@Before
61+
public void setup() {
62+
testEnvironmentProvider = new TestEnvironmentProvider();
63+
testEnvironmentProvider.setEnv("GOOGLE_SDK_JAVA_LOGGING", "true");
64+
LoggingConfigs.setEnvironmentProvider(testEnvironmentProvider);
65+
}
66+
67+
@After
68+
public void tearDown() {
69+
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
70+
loggerContext.getLogger(Logger.ROOT_LOGGER_NAME).detachAppender("CONSOLE");
71+
}
72+
73+
private TestAppender setupTestLogger(Class<?> clazz) {
74+
TestAppender testAppender = new TestAppender();
75+
testAppender.start();
76+
Logger logger = LoggerFactory.getLogger(clazz);
77+
((ch.qos.logback.classic.Logger) logger).addAppender(testAppender);
78+
return testAppender;
79+
}
80+
81+
@Test
82+
public void getRequestMetadata_hasAccessToken() throws IOException {
83+
TestAppender testAppender = setupTestLogger(ServiceAccountCredentials.class);
84+
GoogleCredentials credentials =
85+
ServiceAccountCredentialsTest.createDefaultBuilderWithToken(ACCESS_TOKEN)
86+
.setScopes(SCOPES)
87+
.build();
88+
Map<String, List<String>> metadata = credentials.getRequestMetadata(CALL_URI);
89+
TestUtils.assertContainsBearerToken(metadata, ACCESS_TOKEN);
90+
91+
assertEquals(3, testAppender.events.size());
92+
assertEquals(
93+
"Sending auth request to refresh access token.",
94+
testAppender.events.get(0).getFormattedMessage());
95+
testAppender.stop();
96+
}
97+
98+
@Test
99+
public void idTokenWithAudience_iamFlow_targetAudienceMatchesAudClaim() throws IOException {
100+
TestAppender testAppender = setupTestLogger(ServiceAccountCredentials.class);
101+
String nonGDU = "test.com";
102+
MockIAMCredentialsServiceTransportFactory transportFactory =
103+
new MockIAMCredentialsServiceTransportFactory(nonGDU);
104+
transportFactory.getTransport().setTargetPrincipal(CLIENT_EMAIL);
105+
transportFactory.getTransport().setIdToken(DEFAULT_ID_TOKEN);
106+
transportFactory.getTransport().addStatusCodeAndMessage(HttpStatusCodes.STATUS_CODE_OK, "");
107+
ServiceAccountCredentials credentials =
108+
createDefaultBuilder()
109+
.setScopes(SCOPES)
110+
.setHttpTransportFactory(transportFactory)
111+
.setUniverseDomain(nonGDU)
112+
.build();
113+
114+
String targetAudience = "https://foo.bar";
115+
IdTokenCredentials tokenCredential =
116+
IdTokenCredentials.newBuilder()
117+
.setIdTokenProvider(credentials)
118+
.setTargetAudience(targetAudience)
119+
.build();
120+
tokenCredential.refresh();
121+
assertEquals(DEFAULT_ID_TOKEN, tokenCredential.getAccessToken().getTokenValue());
122+
assertEquals(DEFAULT_ID_TOKEN, tokenCredential.getIdToken().getTokenValue());
123+
124+
// ID Token's aud claim is `https://foo.bar`
125+
assertEquals(
126+
targetAudience,
127+
tokenCredential.getIdToken().getJsonWebSignature().getPayload().getAudience());
128+
129+
assertEquals(2, testAppender.events.size());
130+
assertEquals(
131+
"Sending id token request to Iam Endpoint.",
132+
testAppender.events.get(0).getFormattedMessage());
133+
assertEquals("Auth response payload.", testAppender.events.get(1).getFormattedMessage());
134+
135+
testAppender.stop();
136+
}
137+
}

oauth2_http/javatests/com/google/auth/oauth2/LoggingUtilsTest.java

Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,31 +42,83 @@
4242
import org.mockito.Mockito;
4343
import org.slf4j.Logger;
4444
import org.slf4j.LoggerFactory;
45+
import org.slf4j.event.Level;
4546

4647
public class LoggingUtilsTest {
4748
private static final Logger LOGGER = LoggerFactory.getLogger(LoggingUtilsTest.class);
4849

50+
private TestAppender setupTestLogger() {
51+
TestAppender testAppender = new TestAppender();
52+
testAppender.start();
53+
((ch.qos.logback.classic.Logger) LOGGER).addAppender(testAppender);
54+
return testAppender;
55+
}
56+
4957
@Test
5058
public void testLogWithMDC_slf4jLogger() {
51-
TestAppender.clearEvents();
59+
60+
TestAppender testAppender = setupTestLogger();
61+
5262
Map<String, String> contextMap = new HashMap<>();
5363
contextMap.put("key1", "value1");
5464
contextMap.put("key2", "value2");
55-
LoggingUtils.logWithMDC(LOGGER, org.slf4j.event.Level.DEBUG, contextMap, "test message");
65+
LoggingUtils.logWithMDC(LOGGER, Level.DEBUG, contextMap, "test message");
5666

57-
assertEquals(1, TestAppender.events.size());
58-
assertEquals("test message", TestAppender.events.get(0).getFormattedMessage());
67+
assertEquals(1, testAppender.events.size());
68+
assertEquals("test message", testAppender.events.get(0).getFormattedMessage());
5969

6070
// Verify MDC content
61-
ILoggingEvent event = TestAppender.events.get(0);
71+
ILoggingEvent event = testAppender.events.get(0);
6272
assertEquals(2, event.getMDCPropertyMap().size());
73+
assertEquals(ch.qos.logback.classic.Level.DEBUG, event.getLevel());
6374
assertEquals("value1", event.getMDCPropertyMap().get("key1"));
6475
assertEquals("value2", event.getMDCPropertyMap().get("key2"));
76+
77+
testAppender.stop();
78+
}
79+
80+
@Test
81+
public void testLogWithMDC_INFO() {
82+
TestAppender testAppender = setupTestLogger();
83+
LoggingUtils.logWithMDC(LOGGER, Level.INFO, new HashMap<>(), "test message");
84+
85+
assertEquals(1, testAppender.events.size());
86+
assertEquals(ch.qos.logback.classic.Level.INFO, testAppender.events.get(0).getLevel());
87+
testAppender.stop();
88+
}
89+
90+
@Test
91+
public void testLogWithMDC_TRACE() {
92+
TestAppender testAppender = setupTestLogger();
93+
LoggingUtils.logWithMDC(LOGGER, Level.TRACE, new HashMap<>(), "test message");
94+
95+
assertEquals(0, testAppender.events.size());
96+
testAppender.stop();
97+
}
98+
99+
@Test
100+
public void testLogWithMDC_WARN() {
101+
TestAppender testAppender = setupTestLogger();
102+
LoggingUtils.logWithMDC(LOGGER, Level.WARN, new HashMap<>(), "test message");
103+
104+
assertEquals(1, testAppender.events.size());
105+
assertEquals(ch.qos.logback.classic.Level.WARN, testAppender.events.get(0).getLevel());
106+
testAppender.stop();
107+
}
108+
109+
@Test
110+
public void testLogWithMDC_ERROR() {
111+
TestAppender testAppender = setupTestLogger();
112+
LoggingUtils.logWithMDC(LOGGER, Level.ERROR, new HashMap<>(), "test message");
113+
114+
assertEquals(1, testAppender.events.size());
115+
assertEquals(ch.qos.logback.classic.Level.ERROR, testAppender.events.get(0).getLevel());
116+
testAppender.stop();
65117
}
66118

67119
@Test
68120
public void testLogGenericData() {
69-
TestAppender.clearEvents();
121+
TestAppender testAppender = setupTestLogger();
70122
GenericData genericData = Mockito.mock(GenericData.class);
71123

72124
GenericData data = new GenericData();
@@ -75,11 +127,13 @@ public void testLogGenericData() {
75127

76128
LoggingUtils.logGenericData(data, LOGGER, "test generic data");
77129

78-
assertEquals(1, TestAppender.events.size());
79-
Map<String, String> mdcPropertyMap = TestAppender.events.get(0).getMDCPropertyMap();
130+
assertEquals(1, testAppender.events.size());
131+
Map<String, String> mdcPropertyMap = testAppender.events.get(0).getMDCPropertyMap();
80132
assertEquals(2, mdcPropertyMap.size());
81133
assertEquals("value1", mdcPropertyMap.get("key1"));
82134
assertNotNull(mdcPropertyMap.get("token"));
83135
assertNotEquals("value2", mdcPropertyMap.get("token"));
136+
137+
testAppender.stop();
84138
}
85139
}

0 commit comments

Comments
 (0)