diff --git a/pom.xml b/pom.xml index b079231..58c4f0f 100644 --- a/pom.xml +++ b/pom.xml @@ -193,6 +193,12 @@ ${aws.sdkv2.version} provided + + software.amazon.awssdk + iam + ${aws.sdkv2.version} + provided + software.amazon.awssdk netty-nio-client diff --git a/src/main/java/cloud/localstack/awssdkv2/TestUtils.java b/src/main/java/cloud/localstack/awssdkv2/TestUtils.java index a5d1c36..ae9d3d6 100644 --- a/src/main/java/cloud/localstack/awssdkv2/TestUtils.java +++ b/src/main/java/cloud/localstack/awssdkv2/TestUtils.java @@ -12,6 +12,7 @@ import software.amazon.awssdk.services.s3.*; import software.amazon.awssdk.services.secretsmanager.SecretsManagerAsyncClient; import software.amazon.awssdk.services.ssm.*; +import software.amazon.awssdk.services.iam.*; import software.amazon.awssdk.auth.credentials.*; import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; import software.amazon.awssdk.core.client.builder.SdkAsyncClientBuilder; @@ -62,7 +63,11 @@ public static CloudWatchAsyncClient getClientCloudWatchAsyncV2() { public static LambdaAsyncClient getClientLambdaAsyncV2() { return wrapApiClientV2(LambdaAsyncClient.builder(), Localstack.INSTANCE.getEndpointCloudWatch()).build(); } - + + public static IamAsyncClient getClientIamAsyncV2() { + return wrapApiClientV2(IamAsyncClient.builder(), Localstack.INSTANCE.getEndpointIAM()).build(); + } + public static T wrapApiClientV2(T builder, String endpointURL) { try { return (T) ((AwsClientBuilder)builder diff --git a/src/test/java/cloud/localstack/IAMTest.java b/src/test/java/cloud/localstack/IAMTest.java new file mode 100644 index 0000000..0ea5e83 --- /dev/null +++ b/src/test/java/cloud/localstack/IAMTest.java @@ -0,0 +1,67 @@ +package cloud.localstack; + +import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import cloud.localstack.docker.annotation.LocalstackDockerProperties; +import cloud.localstack.awssdkv1.TestUtils; + +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; + +import com.amazonaws.services.identitymanagement.AmazonIdentityManagement; +import com.amazonaws.services.identitymanagement.model.*; + +import org.junit.Test; +import org.junit.runner.RunWith; + + +@RunWith(LocalstackTestRunner.class) +@LocalstackDockerProperties(services = {"iam"}, ignoreDockerRunErrors=true) +public class IAMTest { + + /** + * Test the creation of a IAM user. + */ + @Test + public void testUserCreation() throws Exception { + AmazonIdentityManagement iamClient = TestUtils.getClientIAM(); + + String username = UUID.randomUUID().toString(); + CreateUserRequest createUserRequest = new CreateUserRequest(username); + iamClient.createUser(createUserRequest); + + ListUsersRequest listUsersRequest = new ListUsersRequest(); + ListUsersResult response = iamClient.listUsers(listUsersRequest); + + boolean userFound = false; + for (User user : response.getUsers()) { + + if(user.getUserName().equals(username)){ + userFound = true; + break; + } + } + + assertEquals(true, userFound); + + } + + @Test + public void testIAMListUserPagination() throws Exception { + AmazonIdentityManagement iamClient = TestUtils.getClientIAM(); + + String username = UUID.randomUUID().toString(); + CreateUserRequest createUserRequest = new CreateUserRequest(username); + iamClient.createUser(createUserRequest); + + AtomicBoolean userFound = new AtomicBoolean(false); + iamClient.listUsers().getUsers().forEach(user->{ + if(user.getUserName().equals(username)){ + userFound.set(true);; + } + }); + + assertTrue(userFound.get()); + } +} diff --git a/src/test/java/cloud/localstack/awssdkv2/BasicFeaturesSDKV2Test.java b/src/test/java/cloud/localstack/awssdkv2/BasicFeaturesSDKV2Test.java index d2d8657..ff297e3 100644 --- a/src/test/java/cloud/localstack/awssdkv2/BasicFeaturesSDKV2Test.java +++ b/src/test/java/cloud/localstack/awssdkv2/BasicFeaturesSDKV2Test.java @@ -2,6 +2,7 @@ import cloud.localstack.Constants; import cloud.localstack.LocalstackTestRunner; +import cloud.localstack.docker.annotation.LocalstackDockerProperties; import cloud.localstack.sample.LambdaHandler; import cloud.localstack.utils.LocalTestUtil; @@ -12,6 +13,9 @@ import software.amazon.awssdk.services.cloudwatch.model.*; import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient; import software.amazon.awssdk.services.dynamodb.model.*; +import software.amazon.awssdk.services.iam.*; +import software.amazon.awssdk.services.iam.model.*; +import software.amazon.awssdk.services.iam.paginators.ListUsersPublisher; import software.amazon.awssdk.services.kinesis.*; import software.amazon.awssdk.services.kinesis.model.*; import software.amazon.awssdk.services.lambda.model.CreateFunctionRequest; @@ -42,8 +46,11 @@ import software.amazon.awssdk.core.SdkBytes; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; @RunWith(LocalstackTestRunner.class) +@LocalstackDockerProperties(ignoreDockerRunErrors=true) public class BasicFeaturesSDKV2Test { static { @@ -258,4 +265,47 @@ public void testLambdaCreateListFunctions() throws Exception { val function = functions.functions().stream().filter(f -> f.functionName().equals(functionName)).findFirst().get(); Assert.assertNotNull(function); } + + @Test + public void testIAMUserCreation() throws Exception { + IamAsyncClient iamClient = TestUtils.getClientIamAsyncV2(); + + String username = UUID.randomUUID().toString(); + CreateUserRequest createUserRequest = CreateUserRequest.builder().userName(username).build(); + iamClient.createUser(createUserRequest); + + boolean userFound = false; + List users = iamClient.listUsers().get().users(); + + + for (int i = 0; i < users.size(); i++) { + System.out.println(users.get(i).userName()); + if(users.get(i).userName().equals(username)){ + userFound = true; + break; + } + } + + Assert.assertTrue(userFound); + } + + @Test + public void testIAMListUserPagination() throws Exception { + IamAsyncClient iamClient = TestUtils.getClientIamAsyncV2(); + + String username = UUID.randomUUID().toString(); + CreateUserRequest createUserRequest = CreateUserRequest.builder().userName(username).build(); + iamClient.createUser(createUserRequest); + + + AtomicBoolean userFound = new AtomicBoolean(false); + iamClient.listUsersPaginator().users().subscribe(user -> { + if(user.userName().equals(username)){ + userFound.set(true); + } + }); + + TimeUnit.SECONDS.sleep(2); + Assert.assertTrue(userFound.get()); + } }