Skip to content

Commit

Permalink
Test framework update (#672)
Browse files Browse the repository at this point in the history
* Initial working tests

* Remove CIAM extra query parameter

* Fix failing tests

* Remove duplicate unit tests

* Remove duplicate unit tests

* Update tests with mocking to use Mockito

* Remove testng and powermock, add junit and mockito

* Remove AbstractMsalTests and PowerMockTestCase

* Fix mistaken null check

* Properly scope dependency
  • Loading branch information
Avery-Dunn committed Jul 10, 2023
1 parent 24c6d2a commit 3c00622
Show file tree
Hide file tree
Showing 51 changed files with 1,262 additions and 2,892 deletions.
38 changes: 25 additions & 13 deletions msal4j-sdk/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -68,29 +68,42 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.1.0</version>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-testng</artifactId>
<version>2.0.0</version>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-easymock</artifactId>
<version>2.0.0</version>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>4.0.2</version>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>4.7.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>4.7.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>1.14.5</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.skyscreamer</groupId>
<artifactId>jsonassert</artifactId>
Expand Down Expand Up @@ -156,7 +169,6 @@
</pluginRepositories>

<build>
<sourceDirectory>${project.build.directory}/delombok</sourceDirectory>
<plugins>
<plugin>
<groupId>org.projectlombok</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,18 @@
package com.microsoft.aad.msal4j;

import labapi.*;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Assert;
import org.testng.annotations.Test;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

import java.net.MalformedURLException;
import java.net.URI;
Expand All @@ -17,120 +25,99 @@
import java.util.Map;
import java.util.concurrent.ExecutionException;

public class AcquireTokenInteractiveIT extends SeleniumTest {
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class AcquireTokenInteractiveIT extends SeleniumTest {
private final static Logger LOG = LoggerFactory.getLogger(AuthorizationCodeIT.class);

private Config cfg;

@Test(dataProvider = "environments", dataProviderClass = EnvironmentsProvider.class)
public void acquireTokenInteractive_ManagedUser(String environment) {

@BeforeAll
public void setupUserProvider() {
setUpLapUserProvider();
}

@AfterEach
public void stopBrowser() {
cleanUp();
}

@BeforeEach
public void startBrowser() {
startUpBrowser();
}

@ParameterizedTest
@MethodSource("com.microsoft.aad.msal4j.EnvironmentsProvider#createData")
void acquireTokenInteractive_ManagedUser(String environment) {
cfg = new Config(environment);

User user = labUserProvider.getDefaultUser(cfg.azureEnvironment);
assertAcquireTokenCommon(user, cfg.organizationsAuthority(), cfg.graphDefaultScope());
}

@Test()
public void acquireTokenInteractive_ADFSv2019_OnPrem() {
void acquireTokenInteractive_ADFSv2019_OnPrem() {
User user = labUserProvider.getOnPremAdfsUser(FederationProvider.ADFS_2019);
assertAcquireTokenCommon(user, TestConstants.ADFS_AUTHORITY, TestConstants.ADFS_SCOPE);
}

@Test(dataProvider = "environments", dataProviderClass = EnvironmentsProvider.class)
public void acquireTokenInteractive_ADFSv2019_Federated(String environment) {
@ParameterizedTest
@MethodSource("com.microsoft.aad.msal4j.EnvironmentsProvider#createData")
void acquireTokenInteractive_ADFSv2019_Federated(String environment) {
cfg = new Config(environment);

User user = labUserProvider.getFederatedAdfsUser(cfg.azureEnvironment, FederationProvider.ADFS_2019);
assertAcquireTokenCommon(user, cfg.organizationsAuthority(), cfg.graphDefaultScope());
}

@Test(dataProvider = "environments", dataProviderClass = EnvironmentsProvider.class)
public void acquireTokenInteractive_ADFSv4_Federated(String environment) {
@ParameterizedTest
@MethodSource("com.microsoft.aad.msal4j.EnvironmentsProvider#createData")
void acquireTokenInteractive_ADFSv4_Federated(String environment) {
cfg = new Config(environment);

User user = labUserProvider.getFederatedAdfsUser(cfg.azureEnvironment, FederationProvider.ADFS_4);
assertAcquireTokenCommon(user, cfg.organizationsAuthority(), cfg.graphDefaultScope());
}

@Test(dataProvider = "environments", dataProviderClass = EnvironmentsProvider.class)
public void acquireTokenInteractive_ADFSv3_Federated(String environment) {
@ParameterizedTest
@MethodSource("com.microsoft.aad.msal4j.EnvironmentsProvider#createData")
void acquireTokenInteractive_ADFSv3_Federated(String environment) {
cfg = new Config(environment);

User user = labUserProvider.getFederatedAdfsUser(cfg.azureEnvironment, FederationProvider.ADFS_3);
assertAcquireTokenCommon(user, cfg.organizationsAuthority(), cfg.graphDefaultScope());
}

@Test(dataProvider = "environments", dataProviderClass = EnvironmentsProvider.class)
public void acquireTokenInteractive_ADFSv2_Federated(String environment) {
@ParameterizedTest
@MethodSource("com.microsoft.aad.msal4j.EnvironmentsProvider#createData")
void acquireTokenInteractive_ADFSv2_Federated(String environment) {
cfg = new Config(environment);

User user = labUserProvider.getFederatedAdfsUser(cfg.azureEnvironment, FederationProvider.ADFS_2);
assertAcquireTokenCommon(user, cfg.organizationsAuthority(), cfg.graphDefaultScope());
}

@Test
public void acquireTokenInteractive_Ciam() {
User user = labUserProvider.getCiamUser();

Map<String, String> extraQueryParameters = new HashMap<>();
extraQueryParameters.put("dc","ESTS-PUB-EUS-AZ1-FD000-TEST1");

PublicClientApplication pca;
try {
pca = PublicClientApplication.builder(
user.getAppId()).
authority("https://" + user.getLabName() + ".ciamlogin.com/")
.build();
} catch (MalformedURLException ex) {
throw new RuntimeException(ex.getMessage());
}

IAuthenticationResult result;
try {
URI url = new URI("http://localhost:8080");

SystemBrowserOptions browserOptions =
SystemBrowserOptions
.builder()
.openBrowserAction(new SeleniumOpenBrowserAction(user, pca))
.build();

InteractiveRequestParameters parameters = InteractiveRequestParameters
.builder(url)
.scopes(Collections.singleton(TestConstants.GRAPH_DEFAULT_SCOPE))
.extraQueryParameters(extraQueryParameters)
.systemBrowserOptions(browserOptions)
.build();

result = pca.acquireToken(parameters).get();

} catch (Exception e) {
LOG.error("Error acquiring token with authCode: " + e.getMessage());
throw new RuntimeException("Error acquiring token with authCode: " + e.getMessage());
}

assertTokenResultNotNull(result);
Assert.assertEquals(user.getUpn(), result.account().username());
}

@Test(dataProvider = "environments", dataProviderClass = EnvironmentsProvider.class)
public void acquireTokenWithAuthorizationCode_B2C_Local(String environment) {
@ParameterizedTest
@MethodSource("com.microsoft.aad.msal4j.EnvironmentsProvider#createData")
void acquireTokenWithAuthorizationCode_B2C_Local(String environment) {
cfg = new Config(environment);

User user = labUserProvider.getB2cUser(cfg.azureEnvironment, B2CProvider.LOCAL);
assertAcquireTokenB2C(user, TestConstants.B2C_AUTHORITY);
}

@Test(dataProvider = "environments", dataProviderClass = EnvironmentsProvider.class)
public void acquireTokenWithAuthorizationCode_B2C_LegacyFormat(String environment) {
@ParameterizedTest
@MethodSource("com.microsoft.aad.msal4j.EnvironmentsProvider#createData")
void acquireTokenWithAuthorizationCode_B2C_LegacyFormat(String environment) {
cfg = new Config(environment);

User user = labUserProvider.getB2cUser(cfg.azureEnvironment, B2CProvider.LOCAL);
assertAcquireTokenB2C(user, TestConstants.B2C_AUTHORITY_LEGACY_FORMAT);
}

@Test
public void acquireTokenInteractive_ManagedUser_InstanceAware() {
void acquireTokenInteractive_ManagedUser_InstanceAware() {
cfg = new Config(AzureEnvironment.AZURE);

User user = labUserProvider.getDefaultUser(AzureEnvironment.AZURE_US_GOVERNMENT);
Expand All @@ -154,7 +141,7 @@ private void assertAcquireTokenCommon(User user, String authority, String scope)
scope);

assertTokenResultNotNull(result);
Assert.assertEquals(user.getUpn(), result.account().username());
assertEquals(user.getUpn(), result.account().username());
}

private void assertAcquireTokenB2C(User user, String authority) {
Expand Down Expand Up @@ -187,13 +174,13 @@ private void assertAcquireTokenInstanceAware(User user) {
IAuthenticationResult result = acquireTokenInteractive_instanceAware(user, pca, cfg.graphDefaultScope());

assertTokenResultNotNull(result);
Assert.assertEquals(user.getUpn(), result.account().username());
assertEquals(user.getUpn(), result.account().username());

//This test is using a client app with the login.microsoftonline.com config to get tokens for a login.microsoftonline.us user,
// so when using instance aware the result's environment will be for the user/account and not the client app
Assert.assertNotEquals(pca.authenticationAuthority.host, result.environment());
Assert.assertEquals(result.account().environment(), result.environment());
Assert.assertEquals(result.account().environment(), pca.getAccounts().join().iterator().next().environment());
assertNotEquals(pca.authenticationAuthority.host, result.environment());
assertEquals(result.account().environment(), result.environment());
assertEquals(result.account().environment(), pca.getAccounts().join().iterator().next().environment());

IAuthenticationResult cachedResult;
try {
Expand All @@ -203,17 +190,7 @@ private void assertAcquireTokenInstanceAware(User user) {
}

//Ensure that the cached environment matches the original auth result environment (.us) instead of the client app's (.com)
Assert.assertEquals(result.account().environment(), cachedResult.environment());
}

//@Test
public void acquireTokensInHomeAndGuestClouds_ArlingtonAccount() throws MalformedURLException, ExecutionException, InterruptedException {
acquireTokensInHomeAndGuestClouds(AzureEnvironment.AZURE_US_GOVERNMENT);
}

//@Test
public void acquireTokensInHomeAndGuestClouds_MooncakeAccount() throws MalformedURLException, ExecutionException, InterruptedException {
acquireTokensInHomeAndGuestClouds(AzureEnvironment.AZURE_CHINA);
assertEquals(result.account().environment(), cachedResult.environment());
}

private IAuthenticationResult acquireTokenSilently(IPublicClientApplication pca, IAccount account, String scope) throws InterruptedException, ExecutionException, MalformedURLException {
Expand Down Expand Up @@ -251,11 +228,11 @@ public void afterCacheAccess(ITokenCacheAccessContext iTokenCacheAccessContext)

IAuthenticationResult result = acquireTokenInteractive(user, publicCloudPca, TestConstants.USER_READ_SCOPE);
assertTokenResultNotNull(result);
Assert.assertEquals(user.getHomeUPN(), result.account().username());
assertEquals(user.getHomeUPN(), result.account().username());

publicCloudPca.removeAccount(publicCloudPca.getAccounts().join().iterator().next()).join();

Assert.assertEquals(publicCloudPca.getAccounts().join().size(), 0);
assertEquals(publicCloudPca.getAccounts().join().size(), 0);
}

private IAuthenticationResult acquireTokenInteractive(
Expand Down Expand Up @@ -289,9 +266,9 @@ private IAuthenticationResult acquireTokenInteractive(
}

private void assertTokenResultNotNull(IAuthenticationResult result) {
Assert.assertNotNull(result);
Assert.assertNotNull(result.accessToken());
Assert.assertNotNull(result.idToken());
assertNotNull(result);
assertNotNull(result.accessToken());
assertNotNull(result.idToken());
}

private IAuthenticationResult acquireTokenInteractive_instanceAware(
Expand Down
Loading

0 comments on commit 3c00622

Please sign in to comment.