Skip to content

Commit 06caf48

Browse files
committed
chore: add test coverage
1 parent edea209 commit 06caf48

File tree

5 files changed

+301
-15
lines changed

5 files changed

+301
-15
lines changed

src/main/java/com/google/firebase/fpnv/FirebasePnvToken.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
import com.google.common.collect.ImmutableList;
2222
import com.google.common.collect.ImmutableMap;
23-
import com.nimbusds.jwt.JWTClaimsSet;
2423
import java.util.List;
2524
import java.util.Map;
2625

src/main/java/com/google/firebase/fpnv/internal/FirebasePnvTokenVerifier.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,7 @@ private void verifyClaims(JWTClaimsSet claims) throws FirebasePnvException {
151151
}
152152

153153
// Verify Audience
154-
if (claims.getAudience() == null
155-
|| claims.getAudience().isEmpty()
154+
if (claims.getAudience().isEmpty()
156155
|| !claims.getAudience().contains(issuer)
157156
) {
158157
throw new FirebasePnvException(FirebasePnvErrorCode.INVALID_TOKEN,
@@ -174,10 +173,7 @@ private DefaultJWTProcessor<SecurityContext> createJwtProcessor() {
174173
DefaultJWTProcessor<SecurityContext> processor = new DefaultJWTProcessor<>();
175174
try {
176175
// Use JWKSourceBuilder instead of deprecated RemoteJWKSet
177-
JWKSource<SecurityContext> keySource = JWKSourceBuilder
178-
.create(new URL(FPNV_JWKS_URL))
179-
.retrying(true) // Helper to retry on transient network errors
180-
.build();
176+
JWKSource<SecurityContext> keySource = createKeySource();
181177

182178
JWSKeySelector<SecurityContext> keySelector =
183179
new JWSVerificationKeySelector<>(JWSAlgorithm.ES256, keySource);
@@ -188,6 +184,19 @@ private DefaultJWTProcessor<SecurityContext> createJwtProcessor() {
188184
return processor;
189185
}
190186

187+
/**
188+
* Helper JWKSourceBuilder.
189+
*
190+
* @return an instance of JWKSource
191+
* @throws MalformedURLException if URL is invalid
192+
*/
193+
protected JWKSource<SecurityContext> createKeySource() throws MalformedURLException {
194+
return JWKSourceBuilder
195+
.create(new URL(FPNV_JWKS_URL))
196+
.retrying(true) // Helper to retry on transient network errors
197+
.build();
198+
}
199+
191200
private String getProjectId(FirebaseApp app) {
192201
String projectId = ImplFirebaseTrampolines.getProjectId(app);
193202
if (Strings.isNullOrEmpty(projectId)) {

src/test/java/com/google/firebase/fpnv/FirebasePnvTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import static org.junit.Assert.assertEquals;
2020
import static org.junit.Assert.assertNotNull;
21+
import static org.junit.Assert.assertNull;
2122
import static org.junit.Assert.assertSame;
2223
import static org.junit.Assert.assertThrows;
2324
import static org.mockito.Mockito.mock;
@@ -113,4 +114,36 @@ public void testVerifyToken_PropagatesException() throws FirebasePnvException {
113114
);
114115
assertEquals(FirebasePnvErrorCode.INVALID_TOKEN, e.getFpnvErrorCode());
115116
}
117+
118+
@Test
119+
public void testVerifyToken_PropagatesException_Service_Error() throws FirebasePnvException {
120+
String testToken = "SERVICE_ERROR";
121+
FirebasePnvException error = new FirebasePnvException(
122+
FirebasePnvErrorCode.SERVICE_ERROR,
123+
"SERVICE_ERROR"
124+
);
125+
126+
when(mockVerifier.verifyToken(testToken)).thenThrow(error);
127+
128+
FirebasePnvException e = assertThrows(FirebasePnvException.class, () ->
129+
FirebasePnv.getInstance().verifyToken(testToken)
130+
);
131+
assertEquals(FirebasePnvErrorCode.SERVICE_ERROR, e.getFpnvErrorCode());
132+
}
133+
134+
@Test
135+
public void testVerifyToken_PropagatesException_Internal_Error() throws FirebasePnvException {
136+
String testToken = "INTERNAL";
137+
FirebasePnvException error = new FirebasePnvException(
138+
null,
139+
"INTERNAL"
140+
);
141+
142+
when(mockVerifier.verifyToken(testToken)).thenThrow(error);
143+
144+
FirebasePnvException e = assertThrows(FirebasePnvException.class, () ->
145+
FirebasePnv.getInstance().verifyToken(testToken)
146+
);
147+
assertNull(null, e.getFpnvErrorCode());
148+
}
116149
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.google.firebase.fpnv;
2+
3+
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertNotNull;
5+
import static org.junit.Assert.assertThrows;
6+
import static org.junit.Assert.assertTrue;
7+
8+
import com.google.common.collect.ImmutableList;
9+
import com.google.firebase.TestOnlyImplFirebaseTrampolines;
10+
import com.google.firebase.internal.FirebaseProcessEnvironment;
11+
import com.nimbusds.jwt.JWTClaimsSet;
12+
import java.util.Date;
13+
import java.util.HashMap;
14+
import java.util.Map;
15+
16+
import org.junit.After;
17+
import org.junit.Test;
18+
19+
20+
21+
public class FirebasePnvTokenTest {
22+
private static final String PROJECT_ID = "mock-project-id-1";
23+
private static final String ISSUER = "https://fpnv.googleapis.com/projects/" + PROJECT_ID;
24+
private final String subject = "+15551234567";
25+
26+
@After
27+
public void tearDown() {
28+
FirebaseProcessEnvironment.clearCache();
29+
TestOnlyImplFirebaseTrampolines.clearInstancesForTest();
30+
}
31+
32+
@Test
33+
public void test_Audience_Empty() {
34+
JWTClaimsSet claims = new JWTClaimsSet.Builder()
35+
.issuer(ISSUER)
36+
.subject(subject)
37+
.expirationTime(new Date(System.currentTimeMillis() + 10000))
38+
.build();
39+
40+
FirebasePnvToken firebasePnvToken = new FirebasePnvToken(claims.getClaims());
41+
42+
assertNotNull(firebasePnvToken);
43+
assertEquals(ImmutableList.of(), firebasePnvToken.getAudience());
44+
}
45+
46+
@Test
47+
public void test_Audience_List() {
48+
JWTClaimsSet claims = new JWTClaimsSet.Builder()
49+
.issuer(ISSUER)
50+
.subject(subject)
51+
.audience(ImmutableList.of())
52+
.expirationTime(new Date(System.currentTimeMillis() + 10000))
53+
.build();
54+
55+
FirebasePnvToken firebasePnvToken = new FirebasePnvToken(claims.getClaims());
56+
57+
assertNotNull(firebasePnvToken);
58+
assertEquals(ImmutableList.of(), firebasePnvToken.getAudience());
59+
}
60+
61+
@Test
62+
public void test_Audience_String() {
63+
Map<String, Object> claims = new HashMap<String, Object>();
64+
claims.put("sub", subject);
65+
claims.put("aud", ISSUER);
66+
67+
68+
FirebasePnvToken firebasePnvToken = new FirebasePnvToken(claims);
69+
70+
assertNotNull(firebasePnvToken);
71+
assertEquals(ImmutableList.of(ISSUER), firebasePnvToken.getAudience());
72+
}
73+
74+
@Test
75+
public void test_No_Sub() {
76+
Map<String, Object> claims = new HashMap<String, Object>();
77+
IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () ->
78+
new FirebasePnvToken(claims)
79+
);
80+
assertTrue(e.getMessage().contains("Claims map must at least contain sub"));
81+
}
82+
83+
@Test
84+
public void test_Null_Sub() {
85+
IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () ->
86+
new FirebasePnvToken(null)
87+
);
88+
assertTrue(e.getMessage().contains("Claims map must at least contain sub"));
89+
}
90+
}

0 commit comments

Comments
 (0)