From af4f52d3fd1cce9b8daa9cb7975905c7f1222ab9 Mon Sep 17 00:00:00 2001 From: Yi Liu Date: Mon, 1 Feb 2021 14:12:12 +0800 Subject: [PATCH 1/5] code for on-demand IT --- .../aad/selenium/AADSeleniumITHelper.java | 6 ++ .../aad/selenium/ondemand/AADOnDemandIT.java | 67 +++++++++++++++++++ .../spring/test/EnvironmentVariable.java | 2 + 3 files changed, 75 insertions(+) create mode 100644 sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/ondemand/AADOnDemandIT.java diff --git a/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/AADSeleniumITHelper.java b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/AADSeleniumITHelper.java index de3af3a53b03..21e8da2dce40 100644 --- a/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/AADSeleniumITHelper.java +++ b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/AADSeleniumITHelper.java @@ -63,4 +63,10 @@ public void logoutTest() { Assert.assertEquals(username, id); } + public String IncrementalConsent(String endpoint) { + driver.get((app.root() + endpoint)); + wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("input[type='submit']"))).click(); + return wait.until(presenceOfElementLocated(By.tagName("body"))).getText(); + } + } diff --git a/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/ondemand/AADOnDemandIT.java b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/ondemand/AADOnDemandIT.java new file mode 100644 index 000000000000..0ddae0628031 --- /dev/null +++ b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/ondemand/AADOnDemandIT.java @@ -0,0 +1,67 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.test.aad.selenium.ondemand; + +import com.azure.test.aad.selenium.AADSeleniumITHelper; +import org.junit.After; +import org.junit.Assert; +import org.junit.Test; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.http.ResponseEntity; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClient; +import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +import static com.azure.spring.test.EnvironmentVariable.AAD_USER_NAME_ON_DEMAND; +import static com.azure.spring.test.EnvironmentVariable.AAD_USER_PASSWORD_ON_DEMAND; +import static com.azure.test.aad.selenium.AADSeleniumITHelper.createDefaultProperties; + +public class AADOnDemandIT { + private AADSeleniumITHelper aadSeleniumITHelper; + + @Test + public void onDemandTest() { + Map properties = createDefaultProperties(); + properties.put("azure.activedirectory.authorization-clients.arm.scopes", + "https://management.azure.com/user_impersonation"); + properties.put("azure.activedirectory.authorization-clients.arm.on-demand", "true"); + + aadSeleniumITHelper = new AADSeleniumITHelper(DumbApp.class, properties, + AAD_USER_NAME_ON_DEMAND, AAD_USER_PASSWORD_ON_DEMAND); + aadSeleniumITHelper.logIn(); + + String httpResponse = aadSeleniumITHelper.httpGet("api/azure"); + Assert.assertTrue(httpResponse.contains("azure")); + + httpResponse = aadSeleniumITHelper.IncrementalConsent("api/arm"); + Assert.assertTrue(httpResponse.contains("arm")); + } + + @After + public void destroy() { + aadSeleniumITHelper.destroy(); + } + + @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true) + @SpringBootApplication + @RestController + public static class DumbApp { + + @GetMapping(value = "/api/azure") + public ResponseEntity azure( + @RegisteredOAuth2AuthorizedClient("azure") OAuth2AuthorizedClient authorizedClient) { + return ResponseEntity.ok("azure"); + } + + @GetMapping(value = "/api/arm") + public ResponseEntity arm( + @RegisteredOAuth2AuthorizedClient("arm") OAuth2AuthorizedClient authorizedClient) { + return ResponseEntity.ok("arm"); + } + } +} \ No newline at end of file diff --git a/sdk/spring/azure-spring-boot-test-core/src/main/java/com/azure/spring/test/EnvironmentVariable.java b/sdk/spring/azure-spring-boot-test-core/src/main/java/com/azure/spring/test/EnvironmentVariable.java index 4ddbe354e6b2..998952ce6063 100644 --- a/sdk/spring/azure-spring-boot-test-core/src/main/java/com/azure/spring/test/EnvironmentVariable.java +++ b/sdk/spring/azure-spring-boot-test-core/src/main/java/com/azure/spring/test/EnvironmentVariable.java @@ -21,8 +21,10 @@ public class EnvironmentVariable { public static final String AAD_TENANT_ID_2 = System.getenv("AAD_TENANT_ID_2"); public static final String AAD_USER_NAME_1 = System.getenv("AAD_USER_NAME_1"); public static final String AAD_USER_NAME_2 = System.getenv("AAD_USER_NAME_2"); + public static final String AAD_USER_NAME_ON_DEMAND = System.getenv("AAD_USER_NAME_ON_DEMAND"); public static final String AAD_USER_PASSWORD_1 = System.getenv("AAD_USER_PASSWORD_1"); public static final String AAD_USER_PASSWORD_2 = System.getenv("AAD_USER_PASSWORD_2"); + public static final String AAD_USER_PASSWORD_ON_DEMAND = System.getenv("AAD_USER_PASSWORD_ON_DEMAND"); public static final String AZURE_KEYVAULT2_URI = System.getenv("AZURE_KEYVAULT2_URI"); public static final String AZURE_KEYVAULT_URI = System.getenv("AZURE_KEYVAULT_URI"); public static final String AZURE_STORAGE_ACCOUNT_KEY = System.getenv("AZURE_STORAGE_ACCOUNT_KEY"); From 05c1c6d275f6424b5e5c78865c61eb3b377454bb Mon Sep 17 00:00:00 2001 From: Yi Liu Date: Mon, 1 Feb 2021 14:15:03 +0800 Subject: [PATCH 2/5] create test user on tests.yml --- sdk/spring/tests.yml | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/sdk/spring/tests.yml b/sdk/spring/tests.yml index 1e33f99ead27..666f145d0534 100644 --- a/sdk/spring/tests.yml +++ b/sdk/spring/tests.yml @@ -75,6 +75,19 @@ jobs: AAD_B2C_USER_PASSWORD: $(java-spring-aad-b2c-user-password) AAD_B2C_CLIENT_ID: $(java-spring-aad-b2c-client-id) AAD_B2C_CLIENT_SECRET: $(java-spring-aad-b2c-client-secret) + AAD_USER_NAME_ON_DEMAND: "user$(System.JobId)@aadittest1.onmicrosoft.com" + AAD_USER_PASSWORD_ON_DEMAND: $(java-spring-aad-user-password-1) + AAD_SERVICE_PRICIPAL_CLIENT_ID: $(java-spring-aad-service-principal-client-id) + AAD_SERVICE_PRICIPAL_CLIENT_SECRET: $(java-spring-aad-service-principal-client-secret) + + PreRunSteps: + - powershell: | + az login --allow-no-subscriptions --tenant $(java-spring-aad-tenant-id-1) --service-principal -u $(java-spring-aad-service-principal-client-id) -p $(java-spring-aad-service-principal-client-secret) + az ad user create --user-principal-name "$env:AAD_USER_NAME_ON_DEMAND" --display-name "user$(System.JobId)" --password "$(java-spring-aad-user-password-1)" --force-change-password-next-login false + az logout + env: + AAD_USER_NAME_ON_DEMAND: "user$(System.JobId)@aadittest1.onmicrosoft.com" + displayName: 'Create On-demand test user' PostRunSteps: - script: | @@ -122,4 +135,17 @@ jobs: AAD_B2C_PROFILE_EDIT: "B2C_1_profileediting1" AAD_B2C_USER_PASSWORD: $(java-spring-aad-b2c-user-password) AAD_B2C_CLIENT_ID: $(java-spring-aad-b2c-client-id) - AAD_B2C_CLIENT_SECRET: $(java-spring-aad-b2c-client-secret) \ No newline at end of file + AAD_B2C_CLIENT_SECRET: $(java-spring-aad-b2c-client-secret) + AAD_USER_NAME_ON_DEMAND: "user$(System.JobId)@aadittest1.onmicrosoft.com" + AAD_USER_PASSWORD_ON_DEMAND: $(java-spring-aad-user-password-1) + AAD_SERVICE_PRICIPAL_CLIENT_ID: $(java-spring-aad-service-principal-client-id) + AAD_SERVICE_PRICIPAL_CLIENT_SECRET: $(java-spring-aad-service-principal-client-secret) + + - powershell: | + az login --allow-no-subscriptions --tenant $(java-spring-aad-tenant-id-1) --service-principal -u $(java-spring-aad-service-principal-client-id) -p $(java-spring-aad-service-principal-client-secret) + az ad user delete --id "$env:AAD_USER_NAME_ON_DEMAND" + az logout + env: + AAD_USER_NAME_ON_DEMAND: "user$(System.JobId)@aadittest1.onmicrosoft.com" + condition: always() + displayName: 'Delete On-demand test user' \ No newline at end of file From 948ff18be0052f308df1c8d73a06ed952ae84829 Mon Sep 17 00:00:00 2001 From: Yi Liu Date: Tue, 2 Feb 2021 10:15:38 +0800 Subject: [PATCH 3/5] add log to check test user in on-demand test --- .../com/azure/test/aad/selenium/AADSeleniumITHelper.java | 2 +- .../com/azure/test/aad/selenium/ondemand/AADOnDemandIT.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/AADSeleniumITHelper.java b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/AADSeleniumITHelper.java index 21e8da2dce40..d3155474c1f1 100644 --- a/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/AADSeleniumITHelper.java +++ b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/AADSeleniumITHelper.java @@ -63,7 +63,7 @@ public void logoutTest() { Assert.assertEquals(username, id); } - public String IncrementalConsent(String endpoint) { + public String httpGetWithIncreamentalConsent(String endpoint) { driver.get((app.root() + endpoint)); wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("input[type='submit']"))).click(); return wait.until(presenceOfElementLocated(By.tagName("body"))).getText(); diff --git a/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/ondemand/AADOnDemandIT.java b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/ondemand/AADOnDemandIT.java index 0ddae0628031..500093bbd445 100644 --- a/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/ondemand/AADOnDemandIT.java +++ b/sdk/spring/azure-spring-boot-test-aad/src/test/java/com/azure/test/aad/selenium/ondemand/AADOnDemandIT.java @@ -7,6 +7,8 @@ import org.junit.After; import org.junit.Assert; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.ResponseEntity; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; @@ -23,6 +25,7 @@ public class AADOnDemandIT { private AADSeleniumITHelper aadSeleniumITHelper; + private static final Logger LOGGER = LoggerFactory.getLogger(AADOnDemandIT.class); @Test public void onDemandTest() { @@ -30,6 +33,7 @@ public void onDemandTest() { properties.put("azure.activedirectory.authorization-clients.arm.scopes", "https://management.azure.com/user_impersonation"); properties.put("azure.activedirectory.authorization-clients.arm.on-demand", "true"); + LOGGER.info(AAD_USER_NAME_ON_DEMAND); aadSeleniumITHelper = new AADSeleniumITHelper(DumbApp.class, properties, AAD_USER_NAME_ON_DEMAND, AAD_USER_PASSWORD_ON_DEMAND); @@ -38,7 +42,7 @@ public void onDemandTest() { String httpResponse = aadSeleniumITHelper.httpGet("api/azure"); Assert.assertTrue(httpResponse.contains("azure")); - httpResponse = aadSeleniumITHelper.IncrementalConsent("api/arm"); + httpResponse = aadSeleniumITHelper.httpGetWithIncreamentalConsent("api/arm"); Assert.assertTrue(httpResponse.contains("arm")); } From f29b9d0225d3817533e2a4044e2ad65d75153fc0 Mon Sep 17 00:00:00 2001 From: Yi Liu Date: Tue, 2 Feb 2021 11:15:10 +0800 Subject: [PATCH 4/5] update tests.yml to fit with stages\archetype-sdk-tests.yml --- sdk/spring/tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/spring/tests.yml b/sdk/spring/tests.yml index ed0390f513ca..c15279b90022 100644 --- a/sdk/spring/tests.yml +++ b/sdk/spring/tests.yml @@ -5,7 +5,7 @@ stages: parameters: TimeoutInMinutes: 240 ServiceDirectory: spring - TestStepMavenInputs: + TestSetupSteps: options: '-Dmaven.wagon.http.pool=false $(DefaultOptions) -Dmaven.javadoc.skip=true -Drevapi.skip=true -DskipSpringITs=false -pl $(ProjectList)' goals: "verify" @@ -80,7 +80,7 @@ stages: AAD_SERVICE_PRICIPAL_CLIENT_ID: $(java-spring-aad-service-principal-client-id) AAD_SERVICE_PRICIPAL_CLIENT_SECRET: $(java-spring-aad-service-principal-client-secret) - PreRunSteps: + PreSteps: - powershell: | az login --allow-no-subscriptions --tenant $(java-spring-aad-tenant-id-1) --service-principal -u $(java-spring-aad-service-principal-client-id) -p $(java-spring-aad-service-principal-client-secret) az ad user create --user-principal-name "$env:AAD_USER_NAME_ON_DEMAND" --display-name "user$(System.JobId)" --password "$(java-spring-aad-user-password-1)" --force-change-password-next-login false @@ -89,7 +89,7 @@ stages: AAD_USER_NAME_ON_DEMAND: "user$(System.JobId)@aadittest1.onmicrosoft.com" displayName: 'Create On-demand test user' - PostRunSteps: + PostSteps: - script: | python --version python -m pip install setuptools termcolor in_place From 76a92d8aa8df71fdd7ffd0f62aa7825583d454cd Mon Sep 17 00:00:00 2001 From: Yi Liu Date: Tue, 2 Feb 2021 11:29:19 +0800 Subject: [PATCH 5/5] add TestStepMavenInputs in AdditionalPlatforms --- sdk/spring/tests.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sdk/spring/tests.yml b/sdk/spring/tests.yml index c15279b90022..0e27b08255f8 100644 --- a/sdk/spring/tests.yml +++ b/sdk/spring/tests.yml @@ -5,9 +5,10 @@ stages: parameters: TimeoutInMinutes: 240 ServiceDirectory: spring - TestSetupSteps: - options: '-Dmaven.wagon.http.pool=false $(DefaultOptions) -Dmaven.javadoc.skip=true -Drevapi.skip=true -DskipSpringITs=false -pl $(ProjectList)' - goals: "verify" + AdditionalPlatforms: + TestStepMavenInputs: + options: '-Dmaven.wagon.http.pool=false $(DefaultOptions) -Dmaven.javadoc.skip=true -Drevapi.skip=true -DskipSpringITs=false -pl $(ProjectList)' + goals: "verify" Artifacts: - name: azure-spring-boot-test-application