using System;
using Amazon.RDS;
using Amazon.RDS.Model;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Amazon.RDS.Internal;
using Amazon.Runtime;
using Amazon.Runtime.Internal;
using AWSSDK_DotNet.CommonTest.Utils;
using Amazon;
using Amazon.Runtime.Internal.Transform;
using Amazon.Runtime.Internal.Auth;
namespace AWSSDK.UnitTests
{
///
/// This test doesn't test the correctness of the PreSignedUrl.
/// It only tests that PreSignedUrlRequestHandler fills in the PresignedUrlProperty
/// when it should, and passes requests through untouched when it should.
/// Correctness will be tested when each individual use case is added.
/// i.e. When we real request classes are made to implement IPreSignedUrlRequest.
///
[TestClass]
public class PreSignedUrlRequestHandlerTest
{
private static readonly string OriginalPreSignedUrlValue = Guid.NewGuid().ToString();
private static readonly string OriginalOtherValue = Guid.NewGuid().ToString();
[TestMethod]
[TestCategory("RDS")]
public void HandleNonPreSignedUrlRequest()
{
var request = new NonPreSignedUrlRequest()
{
OtherProperty = OriginalOtherValue
};
RunPreInvoke(request);
Assert.AreEqual(OriginalOtherValue, request.OtherProperty);
}
[TestMethod]
[TestCategory("RDS")]
public void HandlePreSignedUrlRequestNoSourceRegion()
{
var request = new PreSignedUrlRequest();
RunPreInvoke(request);
Assert.IsNull(request.PreSignedUrl);
}
[TestMethod]
[TestCategory("RDS")]
public void HandlePreSignedUrlRequestPresignedUrlHasValue()
{
var request = new PreSignedUrlRequest()
{
OtherProperty = OriginalOtherValue,
PreSignedUrl = OriginalPreSignedUrlValue,
SourceRegion = RegionEndpoint.USWest1.SystemName
};
RunPreInvoke(request);
Assert.AreEqual(OriginalOtherValue, request.OtherProperty);
Assert.AreEqual(OriginalPreSignedUrlValue, request.PreSignedUrl);
Assert.AreEqual(RegionEndpoint.USWest1.SystemName, request.SourceRegion);
}
[TestMethod]
[TestCategory("RDS")]
public void HandlePreSignedUrlRequest()
{
var request = new PreSignedUrlRequest()
{
OtherProperty = OriginalOtherValue,
SourceRegion = RegionEndpoint.USWest1.SystemName
};
RunPreInvoke(request);
Assert.AreEqual(OriginalOtherValue, request.OtherProperty);
Assert.IsTrue(request.PreSignedUrl.Contains("Key=Property%20with%20spaces"));
Assert.IsTrue(request.PreSignedUrl.Contains("SpecialCharacter=%26%26"));
Assert.AreEqual(RegionEndpoint.USWest1.SystemName, request.SourceRegion);
Assert.IsNotNull(request.PreSignedUrl);
}
private void RunPreInvoke(AmazonWebServiceRequest request)
{
var credentials = new BasicAWSCredentials("access_key", "secret_key");
var handler = new PreSignedUrlRequestHandler(credentials);
var requestContext = new RequestContext(false, new NullSigner());
var responseContext = new ResponseContext();
var executionContext = new ExecutionContext(requestContext, responseContext);
var marshaller = new PreSignedUrlRequestMarshaller();
var clientConfig = new AmazonRDSConfig();
clientConfig.RegionEndpoint = RegionEndpoint.EUWest1;
requestContext.OriginalRequest = request;
requestContext.Marshaller = marshaller;
requestContext.ClientConfig = clientConfig;
// There's extra baggage involved in testing via PreSignedUrlRequestHandler.Invoke.
// So just call PreInvoke since that's where all the relevant logic is anyway.
ReflectionHelpers.Invoke(handler, "PreInvoke", executionContext);
}
///
/// For a real request, the generator would generate this partial class.
///
private partial class PreSignedUrlRequest : AmazonWebServiceRequest
{
public string PreSignedUrl { get; set; }
public string OtherProperty { get; set; }
}
///
/// This is how we make the handler populate PreSignedUrl, by implementing IPreSignedUrlRequest.
/// We add this partial class manually.
///
private partial class PreSignedUrlRequest : AmazonWebServiceRequest, IPreSignedUrlRequest
{
public string SourceRegion { get; set; }
}
///
/// This would be generated.
///
private class PreSignedUrlRequestMarshaller : IMarshaller, IMarshaller
{
public IRequest Marshall(AmazonWebServiceRequest input)
{
return this.Marshall((PreSignedUrlRequest)input);
}
public IRequest Marshall(PreSignedUrlRequest publicRequest)
{
IRequest request = new DefaultRequest(publicRequest, "Amazon.RDS");
request.Parameters.Add("Action", "PreSignedUrl");
request.Parameters.Add("Version", "2014-10-31");
request.Parameters.Add("PreSignedUrl", publicRequest.PreSignedUrl);
request.Parameters.Add("OtherProperty", publicRequest.OtherProperty);
request.Parameters.Add("Key", "Property with spaces");
request.Parameters.Add("SpecialCharacter", "&&");
return request;
}
}
private class NonPreSignedUrlRequest : AmazonWebServiceRequest
{
public string OtherProperty { get; set; }
}
}
}