Skip to content

Commit 3c29885

Browse files
committed
add tests for util classes
1 parent 57fe0c3 commit 3c29885

File tree

4 files changed

+97
-3
lines changed

4 files changed

+97
-3
lines changed

common4j/src/main/com/microsoft/identity/common/java/jwt/JwtUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public static JwtRequestHeader generateJwtRequestHeaderForMsaDR(final byte[] key
8585
* @return a request body object
8686
*/
8787
@NonNull
88-
public static JwtRequestBody generateJwtRequestBodyForMsaDR(final String deviceToken, final String audienceUrl, final String nonce) {
88+
public static JwtRequestBody generateJwtRequestBodyForMsaDR(final String audienceUrl, final String nonce, final String deviceToken) {
8989
final JwtRequestBody jwtRequestBody = new JwtRequestBody();
9090
jwtRequestBody.setAudience(audienceUrl); //TODO: Can i hard code this to login.microsoftonline.com instead of passing parameter?
9191
jwtRequestBody.setNonce(nonce);

common4j/src/main/com/microsoft/identity/common/java/util/MsaUtil.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ import java.util.Locale
3131
* Class for various MSA-related utility methods
3232
*/
3333
class MsaUtil {
34-
companion object {
3534

35+
companion object {
3636
// Header names used when adding device token in headers to /authorize and /token, respectively
3737
val msaAuthorizeEndpointHeader = "x-ms-DeviceCredential"
3838
val msaTokenEndpointHeader = "device_credential"
@@ -46,7 +46,7 @@ class MsaUtil {
4646
false
4747
} else {
4848
// authority has been silently casted to AzureActiveDirectoryAuthority
49-
val audience = authority.audience.tenantId.lowercase(Locale.ROOT)
49+
val audience = authority.mAudience.tenantId.lowercase(Locale.ROOT)
5050

5151
// Check if audience is consumers or the MSA Mega Tenant
5252
audience == AzureActiveDirectoryAudience.MSA_MEGA_TENANT_ID || audience == AzureActiveDirectoryAudience.CONSUMERS

common4j/src/test/com/microsoft/identity/common/java/jwt/JwtUtilsTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,15 @@
2828
import com.google.gson.Gson;
2929
import com.microsoft.identity.common.java.base64.Base64Util;
3030
import com.microsoft.identity.common.java.providers.oauth2.TokenRequest;
31+
import com.microsoft.identity.common.java.util.MsaUtil;
3132

3233
import org.junit.Assert;
3334
import org.junit.Test;
3435
import org.junit.runner.RunWith;
3536
import org.junit.runners.JUnit4;
3637

38+
import java.util.Arrays;
39+
3740
@RunWith(JUnit4.class)
3841
public class JwtUtilsTest {
3942

@@ -59,4 +62,34 @@ public void testGenerateJWT() {
5962
final String encodedJwt = JwtUtils.generateJWT(jwtRequestHeader, jwtRequestBody);
6063
Assert.assertEquals(expectedJwt, encodedJwt);;
6164
}
65+
66+
@Test
67+
public void testGenerateJwtForMsaDR() {
68+
final byte[] mockContext = "mockContext".getBytes();
69+
final String mockAudience = "mockAudience";
70+
final String mockNonce = "mockNonce";
71+
final String mockDeviceToken = "mockDeviceToken";
72+
73+
final JwtRequestHeader expectedJwtRequestHeader = new JwtRequestHeader();
74+
expectedJwtRequestHeader.setAlg(JwtRequestHeader.ALG_VALUE_HS256);
75+
expectedJwtRequestHeader.setKId(JwtRequestHeader.KID_VALUE_ECDH);
76+
expectedJwtRequestHeader.setCtx(Arrays.toString(mockContext));
77+
final JwtRequestBody expectedJwtRequestBody = new JwtRequestBody();
78+
expectedJwtRequestBody.setAudience(mockAudience);
79+
expectedJwtRequestBody.setNonce(mockNonce);
80+
expectedJwtRequestBody.setPurpose(MsaUtil.Companion.getJwtPurpose());
81+
expectedJwtRequestBody.setGrantType(TokenRequest.GrantTypes.DEVICE_AUTH);
82+
expectedJwtRequestBody.setDeviceToken(mockDeviceToken);
83+
final String headerJson = new Gson().toJson(expectedJwtRequestHeader);
84+
final String bodyJson = new Gson().toJson(expectedJwtRequestBody);
85+
86+
final String expectedJwt =
87+
Base64Util.encodeUrlSafeString(headerJson.getBytes(ENCODING_UTF8)) + "." + Base64Util.encodeUrlSafeString(bodyJson.getBytes(ENCODING_UTF8));
88+
89+
final String encodedJwt = JwtUtils.generateJWT(
90+
JwtUtils.generateJwtRequestHeaderForMsaDR(mockContext),
91+
JwtUtils.generateJwtRequestBodyForMsaDR(mockAudience, mockNonce, mockDeviceToken)
92+
);
93+
Assert.assertEquals(expectedJwt, encodedJwt);
94+
}
6295
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// All rights reserved.
3+
//
4+
// This code is licensed under the MIT License.
5+
//
6+
// Permission is hereby granted, free of charge, to any person obtaining a copy
7+
// of this software and associated documentation files(the "Software"), to deal
8+
// in the Software without restriction, including without limitation the rights
9+
// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
10+
// copies of the Software, and to permit persons to whom the Software is
11+
// furnished to do so, subject to the following conditions :
12+
//
13+
// The above copyright notice and this permission notice shall be included in
14+
// all copies or substantial portions of the Software.
15+
//
16+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22+
// THE SOFTWARE.
23+
package com.microsoft.identity.common.java.util
24+
25+
import com.microsoft.identity.common.java.authorities.AccountsInOneOrganization
26+
import com.microsoft.identity.common.java.authorities.AzureActiveDirectoryAudience
27+
import com.microsoft.identity.common.java.authorities.AzureActiveDirectoryAuthority
28+
import com.microsoft.identity.common.java.authorities.AzureActiveDirectoryB2CAuthority
29+
import org.junit.Assert
30+
import org.junit.Test
31+
32+
class MsaUtilTest {
33+
34+
@Test
35+
fun isMsaRequestWithMsaMegaTenantAuthority() {
36+
val msaMegaTenantAuthority = AzureActiveDirectoryAuthority(AccountsInOneOrganization(AzureActiveDirectoryAudience.MSA_MEGA_TENANT_ID))
37+
38+
Assert.assertTrue(MsaUtil.isMsaRequest(msaMegaTenantAuthority))
39+
}
40+
41+
@Test
42+
fun isMsaRequestWithConsumersAuthority() {
43+
val consumersTenantAuthority = AzureActiveDirectoryAuthority(AccountsInOneOrganization(AzureActiveDirectoryAudience.CONSUMERS))
44+
45+
Assert.assertTrue(MsaUtil.isMsaRequest(consumersTenantAuthority))
46+
}
47+
48+
@Test
49+
fun isMsaRequestWithNonMsaAuthority() {
50+
val nonMsaAuthority = AzureActiveDirectoryAuthority(AccountsInOneOrganization(AzureActiveDirectoryAudience.ALL))
51+
52+
Assert.assertFalse(MsaUtil.isMsaRequest(nonMsaAuthority))
53+
}
54+
55+
@Test
56+
fun isMsaRequestWithNonAzureAuthority() {
57+
val nonAzureActiveDirectoryAuthority = AzureActiveDirectoryB2CAuthority("mockUrl")
58+
59+
Assert.assertFalse(MsaUtil.isMsaRequest(nonAzureActiveDirectoryAuthority))
60+
}
61+
}

0 commit comments

Comments
 (0)