/*
* Copyright 2010-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file 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 com.amazonaws.internal.auth;
import com.amazonaws.AmazonWebServiceClient;
import com.amazonaws.AmazonWebServiceRequest;
import com.amazonaws.DefaultRequest;
import com.amazonaws.Request;
import com.amazonaws.SignableRequest;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.NoOpSigner;
import com.amazonaws.auth.RegionAwareSigner;
import com.amazonaws.auth.ServiceAwareSigner;
import com.amazonaws.auth.Signer;
import com.amazonaws.auth.SignerFactory;
import com.amazonaws.auth.SignerTypeAware;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.net.URI;
import java.net.URISyntaxException;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class DefaultSignerProviderTest {
public static final Signer DEFAULT_SIGNER = new NoOpSigner();
private static final String ENDPOINT = "https://mockservice.us-east-1.amazonaws.com";
private static final Request<?> signerAwareRequest = new DefaultRequest<FooSignedRequest>(new FooSignedRequest(), "MockService");
private static final Request<?> nonSignerAwareRequest = new DefaultRequest<NonSignerTypeAware>(new NonSignerTypeAware(), "MockService");
private DefaultSignerProvider defaultSignerProvider;
@Mock
private AmazonWebServiceClient mockClient;
@BeforeClass
public static void setUp() throws URISyntaxException {
SignerFactory.registerSigner("FooSignerType", FooSigner.class);
URI endpoint = new URI(ENDPOINT);
signerAwareRequest.setEndpoint(endpoint);
nonSignerAwareRequest.setEndpoint(endpoint);
}
@Before
public void methodSetUp() {
defaultSignerProvider = new DefaultSignerProvider(mockClient, DEFAULT_SIGNER);
}
@Test
public void usesDefaultIfSignerOverridden() {
when(mockClient.getSignerOverride()).thenReturn("NoOpSignerType");
SignerProviderContext ctx = SignerProviderContext.builder()
.withRequest(signerAwareRequest)
.build();
assertThat(defaultSignerProvider.getSigner(ctx), is(equalTo(DEFAULT_SIGNER)));
}
@Test
public void usesDefaultIfNotSignerAware() {
SignerProviderContext ctx = SignerProviderContext.builder()
.withRequest(nonSignerAwareRequest)
.build();
assertThat(defaultSignerProvider.getSigner(ctx), is(equalTo(DEFAULT_SIGNER)));
}
@Test
public void usesOperationSignerType() {
SignerProviderContext ctx = SignerProviderContext.builder()
.withRequest(signerAwareRequest)
.build();
assertThat(defaultSignerProvider.getSigner(ctx) instanceof FooSigner, is(true));
}
@Test
public void configuresServiceAndRegionWhenUsingOperationSigner() throws URISyntaxException {
when(mockClient.getServiceName()).thenReturn("MockService");
SignerProviderContext ctx = SignerProviderContext.builder()
.withRequest(signerAwareRequest)
.build();
Signer signer = defaultSignerProvider.getSigner(ctx);
FooSigner fooSigner = (FooSigner) signer;
assertThat(fooSigner.getRegionName(), is(equalTo("us-east-1")));
assertThat(fooSigner.getServiceName(), is(equalTo("MockService")));
}
@Test
public void usesDefaultSignerWhenNoRequest() {
SignerProviderContext ctx = SignerProviderContext.builder().build();
assertThat(defaultSignerProvider.getSigner(ctx) == DEFAULT_SIGNER, is(true));
}
public static class FooSigner implements Signer, RegionAwareSigner, ServiceAwareSigner {
private String regionName;
private String serviceName;
@Override
public void sign(SignableRequest<?> request, AWSCredentials credentials) {
}
@Override
public void setRegionName(String regionName) {
this.regionName = regionName;
}
public String getRegionName() {
return regionName;
}
@Override
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
public String getServiceName() {
return serviceName;
}
}
private static class NonSignerTypeAware extends AmazonWebServiceRequest {
}
private static class FooSignedRequest extends AmazonWebServiceRequest implements SignerTypeAware {
@Override
public String getSignerType() {
return "FooSignerType";
}
}
}