/*
* Copyright 2013-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.cloud.aws.context.config.annotation;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import org.apache.http.client.CredentialsProvider;
import org.junit.After;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.test.util.ReflectionTestUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
public class ContextCredentialsConfigurationRegistrarTest {
private AnnotationConfigApplicationContext context;
@After
public void tearDown() throws Exception {
if (this.context != null) {
this.context.close();
}
}
@Test
public void credentialsProvider_defaultCredentialsProviderWithoutFurtherConfig_awsCredentialsProviderConfigured() throws Exception {
//Arrange
this.context = new AnnotationConfigApplicationContext(ApplicationConfigurationWithDefaultCredentialsProvider.class);
//Act
AWSCredentialsProvider awsCredentialsProvider = this.context.getBean(AWSCredentialsProvider.class);
//Assert
assertNotNull(awsCredentialsProvider);
assertTrue(DefaultAWSCredentialsProviderChain.class.isInstance(awsCredentialsProvider));
}
@Test
public void credentialsProvider_configWithAccessAndSecretKey_staticAwsCredentialsProviderConfigured() throws Exception {
//Arrange
this.context = new AnnotationConfigApplicationContext(ApplicationConfigurationWithAccessKeyAndSecretKey.class);
//Act
AWSCredentialsProvider awsCredentialsProvider = this.context.getBean(AWSCredentialsProvider.class);
//Assert
assertNotNull(awsCredentialsProvider);
@SuppressWarnings("unchecked") List<CredentialsProvider> credentialsProviders =
(List<CredentialsProvider>) ReflectionTestUtils.getField(awsCredentialsProvider, "credentialsProviders");
assertEquals(1, credentialsProviders.size());
assertTrue(AWSStaticCredentialsProvider.class.isInstance(credentialsProviders.get(0)));
assertEquals("accessTest", awsCredentialsProvider.getCredentials().getAWSAccessKeyId());
assertEquals("testSecret", awsCredentialsProvider.getCredentials().getAWSSecretKey());
}
@Test
public void credentialsProvider_configWithAccessAndSecretKeyAsExpressions_staticAwsCredentialsProviderConfiguredWithResolvedExpressions() throws Exception {
//Arrange
this.context = new AnnotationConfigApplicationContext();
Map<String, Object> secretAndAccessKeyMap = new HashMap<>();
secretAndAccessKeyMap.put("accessKey", "accessTest");
secretAndAccessKeyMap.put("secretKey", "testSecret");
this.context.getEnvironment().getPropertySources().addLast(new MapPropertySource("test", secretAndAccessKeyMap));
this.context.register(ApplicationConfigurationWithAccessKeyAndSecretKeyAsExpressions.class);
this.context.refresh();
//Act
AWSCredentialsProvider awsCredentialsProvider = this.context.getBean(AWSCredentialsProvider.class);
//Assert
assertNotNull(awsCredentialsProvider);
@SuppressWarnings("unchecked") List<CredentialsProvider> credentialsProviders =
(List<CredentialsProvider>) ReflectionTestUtils.getField(awsCredentialsProvider, "credentialsProviders");
assertEquals(1, credentialsProviders.size());
assertTrue(AWSStaticCredentialsProvider.class.isInstance(credentialsProviders.get(0)));
assertEquals("accessTest", awsCredentialsProvider.getCredentials().getAWSAccessKeyId());
assertEquals("testSecret", awsCredentialsProvider.getCredentials().getAWSSecretKey());
}
@Test
public void credentialsProvider_configWithAccessAndSecretKeyAsPlaceHolders_staticAwsCredentialsProviderConfiguredWithResolvedPlaceHolders() throws Exception {
//Arrange
this.context = new AnnotationConfigApplicationContext();
Map<String, Object> secretAndAccessKeyMap = new HashMap<>();
secretAndAccessKeyMap.put("accessKey", "accessTest");
secretAndAccessKeyMap.put("secretKey", "testSecret");
this.context.getEnvironment().getPropertySources().addLast(new MapPropertySource("test", secretAndAccessKeyMap));
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
configurer.setPropertySources(this.context.getEnvironment().getPropertySources());
this.context.getBeanFactory().registerSingleton("configurer", configurer);
this.context.register(ApplicationConfigurationWithAccessKeyAndSecretKeyAsPlaceHolder.class);
this.context.refresh();
//Act
AWSCredentialsProvider awsCredentialsProvider = this.context.getBean(AWSCredentialsProvider.class);
//Assert
assertNotNull(awsCredentialsProvider);
@SuppressWarnings("unchecked") List<CredentialsProvider> credentialsProviders =
(List<CredentialsProvider>) ReflectionTestUtils.getField(awsCredentialsProvider, "credentialsProviders");
assertEquals(1, credentialsProviders.size());
assertTrue(AWSStaticCredentialsProvider.class.isInstance(credentialsProviders.get(0)));
assertEquals("accessTest", awsCredentialsProvider.getCredentials().getAWSAccessKeyId());
assertEquals("testSecret", awsCredentialsProvider.getCredentials().getAWSSecretKey());
}
@Test
public void credentialsProvider_configWithAccessAndSecretKeyAndInstanceProfile_staticAwsCredentialsProviderConfiguredWithInstanceProfile() throws Exception {
//Arrange
this.context = new AnnotationConfigApplicationContext(ApplicationConfigurationWithAccessKeyAndSecretKeyAndInstanceProfile.class);
//Act
AWSCredentialsProvider awsCredentialsProvider = this.context.getBean(AWSCredentialsProvider.class);
//Assert
assertNotNull(awsCredentialsProvider);
@SuppressWarnings("unchecked") List<CredentialsProvider> credentialsProviders =
(List<CredentialsProvider>) ReflectionTestUtils.getField(awsCredentialsProvider, "credentialsProviders");
assertEquals(2, credentialsProviders.size());
assertTrue(AWSStaticCredentialsProvider.class.isInstance(credentialsProviders.get(0)));
assertTrue(EC2ContainerCredentialsProviderWrapper.class.isInstance(credentialsProviders.get(1)));
}
@Test
public void credentialsProvider_configWithInstanceProfile_instanceProfileCredentialsProviderConfigured() throws Exception {
//Arrange
this.context = new AnnotationConfigApplicationContext(ApplicationConfigurationWithInstanceProfileOnly.class);
//Act
AWSCredentialsProvider awsCredentialsProvider = this.context.getBean(AWSCredentialsProvider.class);
//Assert
assertNotNull(awsCredentialsProvider);
@SuppressWarnings("unchecked") List<CredentialsProvider> credentialsProviders =
(List<CredentialsProvider>) ReflectionTestUtils.getField(awsCredentialsProvider, "credentialsProviders");
assertEquals(1, credentialsProviders.size());
assertTrue(EC2ContainerCredentialsProviderWrapper.class.isInstance(credentialsProviders.get(0)));
}
@Test
public void credentialsProvider_configWithProfileNameAndNoProfilePath_profileCredentialsProviderConfigured() throws Exception {
//Arrange
this.context = new AnnotationConfigApplicationContext(ApplicationConfigurationWithProfileAndDefaultProfilePath.class);
//Act
AWSCredentialsProvider awsCredentialsProvider = this.context.getBean(AWSCredentialsProvider.class);
//Assert
assertNotNull(awsCredentialsProvider);
@SuppressWarnings("unchecked") List<CredentialsProvider> credentialsProviders =
(List<CredentialsProvider>) ReflectionTestUtils.getField(awsCredentialsProvider, "credentialsProviders");
assertEquals(1, credentialsProviders.size());
assertTrue(ProfileCredentialsProvider.class.isInstance(credentialsProviders.get(0)));
ProfileCredentialsProvider provider = (ProfileCredentialsProvider) credentialsProviders.get(0);
assertEquals("test", ReflectionTestUtils.getField(provider, "profileName"));
}
@Test
public void credentialsProvider_configWithProfileNameAndCustomProfilePath_profileCredentialsProviderConfigured() throws Exception {
//Arrange
this.context = new AnnotationConfigApplicationContext();
Map<String, Object> secretAndAccessKeyMap = new HashMap<>();
secretAndAccessKeyMap.put("profilePath", new ClassPathResource(getClass().getSimpleName() + "-profile", getClass()).getFile().getAbsolutePath());
this.context.getEnvironment().getPropertySources().addLast(new MapPropertySource("test", secretAndAccessKeyMap));
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
configurer.setPropertySources(this.context.getEnvironment().getPropertySources());
this.context.getBeanFactory().registerSingleton("configurer", configurer);
this.context.register(ApplicationConfigurationWithProfileAndCustomProfilePath.class);
this.context.refresh();
//Act
AWSCredentialsProvider awsCredentialsProvider = this.context.getBean(AWSCredentialsProvider.class);
//Assert
assertNotNull(awsCredentialsProvider);
@SuppressWarnings("unchecked") List<CredentialsProvider> credentialsProviders =
(List<CredentialsProvider>) ReflectionTestUtils.getField(awsCredentialsProvider, "credentialsProviders");
assertEquals(1, credentialsProviders.size());
assertTrue(ProfileCredentialsProvider.class.isInstance(credentialsProviders.get(0)));
ProfileCredentialsProvider provider = (ProfileCredentialsProvider) credentialsProviders.get(0);
assertEquals("testAccessKey", provider.getCredentials().getAWSAccessKeyId());
assertEquals("testSecretKey", provider.getCredentials().getAWSSecretKey());
}
@Test
public void credentialsProvider_configWithAllProviders_allCredentialsProvidersConfigured() throws Exception {
//Arrange
this.context = new AnnotationConfigApplicationContext(ApplicationConfigurationWithAllProviders.class);
//Act
AWSCredentialsProvider awsCredentialsProvider = this.context.getBean(AWSCredentialsProvider.class);
//Assert
assertNotNull(awsCredentialsProvider);
@SuppressWarnings("unchecked") List<CredentialsProvider> credentialsProviders =
(List<CredentialsProvider>) ReflectionTestUtils.getField(awsCredentialsProvider, "credentialsProviders");
assertEquals(3, credentialsProviders.size());
assertTrue(AWSStaticCredentialsProvider.class.isInstance(credentialsProviders.get(0)));
assertTrue(EC2ContainerCredentialsProviderWrapper.class.isInstance(credentialsProviders.get(1)));
assertTrue(ProfileCredentialsProvider.class.isInstance(credentialsProviders.get(2)));
}
@EnableContextCredentials
public static class ApplicationConfigurationWithDefaultCredentialsProvider {
}
@EnableContextCredentials(accessKey = "accessTest", secretKey = "testSecret")
public static class ApplicationConfigurationWithAccessKeyAndSecretKey {
}
@EnableContextCredentials(accessKey = "#{environment.accessKey}", secretKey = "#{environment.secretKey}")
public static class ApplicationConfigurationWithAccessKeyAndSecretKeyAsExpressions {
}
@EnableContextCredentials(accessKey = "${accessKey}", secretKey = "${secretKey}")
public static class ApplicationConfigurationWithAccessKeyAndSecretKeyAsPlaceHolder {
}
@EnableContextCredentials(accessKey = "accessTest", secretKey = "testSecret", instanceProfile = true)
public static class ApplicationConfigurationWithAccessKeyAndSecretKeyAndInstanceProfile {
}
@EnableContextCredentials(instanceProfile = true)
public static class ApplicationConfigurationWithInstanceProfileOnly {
}
@EnableContextCredentials(profileName = "test")
public static class ApplicationConfigurationWithProfileAndDefaultProfilePath {
}
@EnableContextCredentials(profileName = "customProfile", profilePath = "${profilePath}")
public static class ApplicationConfigurationWithProfileAndCustomProfilePath {
}
@EnableContextCredentials(accessKey = "accessTest", secretKey = "testSecret", instanceProfile = true,
profileName = "customProfile")
public static class ApplicationConfigurationWithAllProviders {
}
}