Skip to content

Commit 38f91b6

Browse files
test: cover token-cache rebuild and supplier exception paths
- DirectCdpTokenProcessorTest: add cases for the rebuild branch (cache cleared, cached-but-expired) and the wrap-on-rebuild-failure path. DirectCdpTokenProcessor is now at 100% line/branch coverage. - TokenProcessorSupplierTest: add cases asserting SneakyThrows propagates supplier SQLExceptions through getToken / getAudience.
1 parent 7e5f2c9 commit 38f91b6

2 files changed

Lines changed: 78 additions & 0 deletions

File tree

jdbc-http/src/test/java/com/salesforce/datacloud/jdbc/auth/DirectCdpTokenProcessorTest.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import static org.assertj.core.api.Assertions.assertThat;
88
import static org.junit.jupiter.api.Assertions.assertThrows;
99

10+
import com.salesforce.datacloud.jdbc.auth.model.DataCloudTokenResponse;
11+
import java.lang.reflect.Field;
1012
import java.sql.SQLException;
1113
import java.util.Properties;
1214
import java.util.UUID;
@@ -113,6 +115,60 @@ void hasCdpTokenReturnsTrueWhenBothPresent() {
113115
assertThat(DirectCdpTokenProcessor.hasCdpToken(props)).isTrue();
114116
}
115117

118+
@Test
119+
void getDataCloudTokenRebuildsWhenCachedTokenExpired() throws Exception {
120+
DirectCdpTokenProcessor processor =
121+
DirectCdpTokenProcessor.ofDestructive(propertiesForCdpToken(FAKE_TOKEN, TENANT_URL));
122+
123+
DataCloudTokenResponse expiredResponse = new DataCloudTokenResponse();
124+
expiredResponse.setToken(FAKE_TOKEN);
125+
expiredResponse.setInstanceUrl(TENANT_URL);
126+
expiredResponse.setTokenType("Bearer");
127+
expiredResponse.setExpiresIn(-1);
128+
DataCloudToken expired = DataCloudToken.of(expiredResponse);
129+
assertThat(expired.isAlive()).isFalse();
130+
131+
Field cache = DirectCdpTokenProcessor.class.getDeclaredField("cachedDataCloudToken");
132+
cache.setAccessible(true);
133+
cache.set(processor, expired);
134+
135+
DataCloudToken rebuilt = processor.getDataCloudToken();
136+
assertThat(rebuilt).isNotSameAs(expired);
137+
assertThat(rebuilt.isAlive()).isTrue();
138+
}
139+
140+
@Test
141+
void getDataCloudTokenRebuildsAfterCacheCleared() throws Exception {
142+
DirectCdpTokenProcessor processor =
143+
DirectCdpTokenProcessor.ofDestructive(propertiesForCdpToken(FAKE_TOKEN, TENANT_URL));
144+
145+
Field cache = DirectCdpTokenProcessor.class.getDeclaredField("cachedDataCloudToken");
146+
cache.setAccessible(true);
147+
cache.set(processor, null);
148+
149+
DataCloudToken rebuilt = processor.getDataCloudToken();
150+
assertThat(rebuilt.getAccessToken()).isEqualTo("Bearer " + FAKE_TOKEN);
151+
assertThat(rebuilt.getTenantId()).isEqualTo(FAKE_TENANT_ID);
152+
}
153+
154+
@Test
155+
void getDataCloudTokenWrapsRebuildFailure() throws Exception {
156+
DirectCdpTokenProcessor processor =
157+
DirectCdpTokenProcessor.ofDestructive(propertiesForCdpToken(FAKE_TOKEN, TENANT_URL));
158+
159+
Field cache = DirectCdpTokenProcessor.class.getDeclaredField("cachedDataCloudToken");
160+
cache.setAccessible(true);
161+
cache.set(processor, null);
162+
163+
Field tenantUrl = DirectCdpTokenProcessor.class.getDeclaredField("tenantUrl");
164+
tenantUrl.setAccessible(true);
165+
tenantUrl.set(processor, null);
166+
167+
SQLException ex = assertThrows(SQLException.class, processor::getDataCloudToken);
168+
assertThat(ex.getSQLState()).isEqualTo("28000");
169+
assertThat(cache.get(processor)).isNull();
170+
}
171+
116172
@Test
117173
void hasCdpTokenReturnsFalseWhenMissing() {
118174
assertThat(DirectCdpTokenProcessor.hasCdpToken(new Properties())).isFalse();

jdbc/src/test/java/com/salesforce/datacloud/jdbc/interceptor/TokenProcessorSupplierTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
package com.salesforce.datacloud.jdbc.interceptor;
66

77
import static org.assertj.core.api.Assertions.assertThat;
8+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
89
import static org.mockito.Mockito.mock;
910
import static org.mockito.Mockito.when;
1011

1112
import com.salesforce.datacloud.jdbc.auth.DataCloudToken;
1213
import com.salesforce.datacloud.jdbc.auth.DataCloudTokenProvider;
1314
import com.salesforce.datacloud.jdbc.auth.DirectCdpTokenProcessor;
15+
import java.sql.SQLException;
1416
import java.util.Properties;
1517
import lombok.val;
1618
import org.junit.jupiter.api.Test;
@@ -61,4 +63,24 @@ void delegatesToCustomSupplier() throws Exception {
6163
assertThat(supplier.getToken()).isEqualTo("Bearer custom");
6264
assertThat(supplier.getAudience()).isEqualTo("custom-tenant");
6365
}
66+
67+
@Test
68+
void getTokenPropagatesSupplierException() {
69+
val supplier = new TokenProcessorSupplier(() -> {
70+
throw new SQLException("supplier failed");
71+
});
72+
73+
assertThatThrownBy(supplier::getToken).isInstanceOf(SQLException.class).hasMessage("supplier failed");
74+
}
75+
76+
@Test
77+
void getAudiencePropagatesSupplierException() {
78+
val supplier = new TokenProcessorSupplier(() -> {
79+
throw new SQLException("supplier failed");
80+
});
81+
82+
assertThatThrownBy(supplier::getAudience)
83+
.isInstanceOf(SQLException.class)
84+
.hasMessage("supplier failed");
85+
}
6486
}

0 commit comments

Comments
 (0)