using System;
using System.Linq;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Amazon.SQS;
using Amazon.SQS.Model;
using Amazon.SQS.Util;
using Amazon;
namespace AWSSDK_DotNet.IntegrationTests.Tests
{
///
/// Summary description for SQSIntegrationTest
///
[TestClass]
public class SQS : TestBase
{
private const string prefix = "TestQueue";
private const string defaultTimeout = "30";
[ClassCleanup]
public static void Cleanup()
{
BaseClean();
}
[TestInitialize]
public void TestInit()
{
var result = Client.ListQueues(new ListQueuesRequest());
Assert.IsNotNull(result);
Assert.IsNotNull(result.QueueUrls);
}
[TestCleanup]
public void SQSCleanup()
{
var result = Client.ListQueues(new ListQueuesRequest());
foreach (string queue in result.QueueUrls)
{
Console.WriteLine("Queue: {0}", queue);
if (queue.Contains("TestQueue"))
{
try
{
Client.DeleteQueue(new DeleteQueueRequest() { QueueUrl = queue });
}
catch (Exception)
{
Console.Write("Failed to clean up queue {0}", queue);
}
}
}
}
[TestMethod]
[TestCategory("SQS")]
public void SQSDLQTest()
{
string mainQueueName = prefix + new Random().Next() + "MQ";
string mainQueueURL = createQueueTest(mainQueueName);
string deadQueueName = prefix + new Random().Next() + "DLQ";
string deadQueueURL = createQueueTest(deadQueueName);
string deadQueueArn = getQueueArn(deadQueueURL);
string redrivePolicy = string.Format(@"{{""maxReceiveCount"" : 5, ""deadLetterTargetArn"" : ""{0}""}}", deadQueueArn);
Client.SetQueueAttributes(new SetQueueAttributesRequest
{
QueueUrl = mainQueueURL,
Attributes = new Dictionary
{
{ QueueAttributeName.RedrivePolicy, redrivePolicy }
}
});
// Wait a bit to make sure the attribute has fully propagated.
Thread.Sleep(1000);
var response = Client.ListDeadLetterSourceQueues(new ListDeadLetterSourceQueuesRequest
{
QueueUrl = deadQueueURL
});
Assert.IsNotNull(response);
Assert.IsNotNull(response.QueueUrls);
Assert.AreEqual(1, response.QueueUrls.Count);
var metadata = response.ResponseMetadata;
Assert.IsNotNull(metadata);
Assert.IsNotNull(metadata.RequestId);
}
[TestMethod]
[TestCategory("SQS")]
public void SimpleSend()
{
int maxMessageLength = 20 * 1024;
string queueName = prefix + new Random().Next();
string queueURL;
queueURL = createQueueTest(queueName);
StringBuilder sb = new StringBuilder("The quick brown fox jumped over the lazy dog");
string messageBody = sb.ToString();
if (messageBody.Length > maxMessageLength)
messageBody = messageBody.Substring(0, maxMessageLength);
TestSendMessage(Client, queueURL, messageBody);
TestSendMessageBatch(Client, queueURL, messageBody);
TestReceiveMessage(Client, queueURL);
}
static Dictionary messageAttributes = new Dictionary
{
{ "StringAttribute", new MessageAttributeValue { DataType = "String", StringValue = "StringAttributeValue" } },
{ "NumberAttribute", new MessageAttributeValue { DataType = "Number", StringValue = "1234" } },
{ "BinaryAttribute", new MessageAttributeValue { DataType = "Binary", BinaryValue = new MemoryStream(Encoding.UTF8.GetBytes("BinaryAttributeValue")) } },
{ "UPPERCASESTRINGATTRIBUTE", new MessageAttributeValue { DataType = "String", StringValue = "UPPERCASESTRINGATTRIBUTE" } },
{ "lowercasestringattribute", new MessageAttributeValue { DataType = "String", StringValue = "lowercasestringattribute" } },
};
private static void TestReceiveMessage(IAmazonSQS client, string queueURL)
{
var receiveResponse = client.ReceiveMessage(new ReceiveMessageRequest { QueueUrl = queueURL });
var messages = receiveResponse.Messages;
foreach (var message in messages)
{
ValidateMD5(message.Body, message.MD5OfBody);
}
}
private static void TestSendMessage(IAmazonSQS client, string queueURL, string messageBody)
{
var request = new SendMessageRequest
{
MessageBody = messageBody,
QueueUrl = queueURL,
MessageAttributes = messageAttributes
};
var response = client.SendMessage(request);
ValidateMD5(request.MessageBody, response.MD5OfMessageBody);
}
private static void TestSendMessageBatch(IAmazonSQS client, string queueUrl, string messageBody)
{
var request = new SendMessageBatchRequest
{
QueueUrl = queueUrl,
Entries = new List
{
new SendMessageBatchRequestEntry
{
MessageBody = messageBody, Id = "fooId"
}
}
};
var response = client.SendMessageBatch(request);
ValidateMD5(request.Entries[0].MessageBody, response.Successful[0].MD5OfMessageBody);
}
public static string Reverse(string s)
{
char[] charArray = s.ToCharArray();
Array.Reverse(charArray);
return new string(charArray);
}
private static string CalculateMD5(string message)
{
return Amazon.SQS.Internal.ValidationResponseHandler.CalculateMD5(message);
}
private static void ValidateMD5(string message, string md5)
{
Amazon.SQS.Internal.ValidationResponseHandler.ValidateMD5(message, md5);
}
[TestMethod]
[TestCategory("SQS")]
public void TestGetQueueUrl()
{
Client.ListQueues(new ListQueuesRequest());
string queueName = "TestGetQueueUrl" + DateTime.Now.Ticks;
CreateQueueResponse createResponse = Client.CreateQueue(new CreateQueueRequest()
{
QueueName = queueName
});
try
{
GetQueueUrlRequest request = new GetQueueUrlRequest() { QueueName = queueName };
GetQueueUrlResponse response = Client.GetQueueUrl(request);
Assert.AreEqual(createResponse.QueueUrl, response.QueueUrl);
}
finally
{
Client.DeleteQueue(new DeleteQueueRequest() { QueueUrl = createResponse.QueueUrl });
}
}
private string getQueueArn(string queueUrl)
{
return Client.GetQueueAttributes(new GetQueueAttributesRequest
{
AttributeNames = new List { "All" },
QueueUrl = queueUrl
}).QueueARN;
}
private void deleteQueueTest(string queueUrl)
{
var listResult = Client.ListQueues(new ListQueuesRequest() { QueueNamePrefix = prefix });
int count = listResult.QueueUrls.Count;
Client.DeleteQueue(new DeleteQueueRequest() { QueueUrl = queueUrl });
for (int i = 0; i < 10; i++)
{
listResult = Client.ListQueues(new ListQueuesRequest() { QueueNamePrefix = prefix });
if (count - 1 == listResult.QueueUrls.Count)
{
return;
}
Console.WriteLine("Sleeping 10s while queue is being deleted");
Thread.Sleep(10000);
}
}
private string createQueueTest(string name)
{
var result = Client.CreateQueue(
new CreateQueueRequest()
{
QueueName = name,
Attributes = new Dictionary
{
{SQSConstants.ATTRIBUTE_VISIBILITY_TIMEOUT,defaultTimeout}
}
});
Assert.IsNotNull(result);
Assert.IsNotNull(result.QueueUrl);
var attrResults = Client.GetQueueAttributes(new GetQueueAttributesRequest()
{
QueueUrl = result.QueueUrl,
AttributeNames = new List() { SQSConstants.ATTRIBUTE_ALL }
});
// if a new attribute has been added, then it's necessary to also update
// SQSConstants and the GetQueueAttributesResponse.Extensions
Assert.AreEqual(12, attrResults.Attributes.Count);
Assert.AreEqual(int.Parse(defaultTimeout), int.Parse(attrResults.Attributes[SQSConstants.ATTRIBUTE_VISIBILITY_TIMEOUT]));
Assert.AreEqual(false, attrResults.FifoQueue);
Assert.AreEqual(false, attrResults.ContentBasedDeduplication.HasValue);
Assert.AreEqual(null, attrResults.ContentBasedDeduplication);
for (int i = 0; i < 30; i++)
{
var listResult = Client.ListQueues(new ListQueuesRequest() { QueueNamePrefix = prefix });
if (listResult.QueueUrls.FirstOrDefault(x => x == result.QueueUrl) != null)
return result.QueueUrl;
Console.WriteLine("Sleeping 10s while queue is being created");
Thread.Sleep(2000);
}
Assert.Fail("Queue never created");
return "fail";
}
[TestMethod]
[TestCategory("SQS")]
public void SQSFIFOTest()
{
string fifoQueueName = prefix + new Random().Next() + ".fifo";
using (var sqsClient = new AmazonSQSClient(RegionEndpoint.USEast2))
{
var result = sqsClient.CreateQueue(new CreateQueueRequest()
{
QueueName = fifoQueueName,
Attributes = new Dictionary
{
{ SQSConstants.ATTRIBUTE_FIFO_QUEUE, "true" },
{ SQSConstants.ATTRIBUTE_CONTENT_BASED_DEDUPLICATION , "true" }
}
});
Assert.IsNotNull(result);
Assert.IsNotNull(result.QueueUrl);
var attrResults = sqsClient.GetQueueAttributes(new GetQueueAttributesRequest()
{
QueueUrl = result.QueueUrl,
AttributeNames = new List() { SQSConstants.ATTRIBUTE_FIFO_QUEUE, SQSConstants.ATTRIBUTE_CONTENT_BASED_DEDUPLICATION }
});
Assert.AreEqual(true, attrResults.FifoQueue);
Assert.AreEqual(true, attrResults.ContentBasedDeduplication);
}
}
}
}