using System; using System.Linq; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Text; using System.Threading; using Microsoft.VisualStudio.TestTools.UnitTesting; using AWSSDK_DotNet.IntegrationTests.Utils; using Amazon.SimpleDB; using Amazon.SimpleDB.Model; namespace AWSSDK_DotNet.IntegrationTests.Tests { /// /// Integration tests for SimpleDB client. /// [TestClass] public class SimpleDB : TestBase { [ClassCleanup] public static void Cleanup() { BaseClean(); } // Name of the domain used for all the integration tests. private static string domainName = "aws-net-sdk-domain-" + DateTime.Now.Ticks; // All test data used in these integration tests. private static List ALL_TEST_DATA = new List{ new ReplaceableItem{ Name= "foo", Attributes= new List { new ReplaceableAttribute{Name="1",Value= "2"}, new ReplaceableAttribute{Name="3",Value= "4"}, new ReplaceableAttribute{Name="5",Value= "6"} } }, new ReplaceableItem{ Name="boo", Attributes= new List { new ReplaceableAttribute{Name="X",Value= "Y"}, new ReplaceableAttribute{Name="Z",Value= "Q"} } }, new ReplaceableItem{ Name= "baa", Attributes= new List { new ReplaceableAttribute{Name="A'",Value= "B'"}, new ReplaceableAttribute{Name="(C)", Value = "(D)"}, new ReplaceableAttribute{Name="E",Value= "F"}} }}; private ReplaceableItem FOO_ITEM = ALL_TEST_DATA[0]; private List ITEM_LIST = new List { ALL_TEST_DATA[1], ALL_TEST_DATA[2] }; [TestCleanup] public void TearDown() { try { DeleteDomain(domainName); } catch (AmazonSimpleDBException) { } } [TestMethod] [TestCategory("SimpleDB")] public void TestSimpleDBOperations() { TestCreateDomain(); try { Thread.Sleep(5 * 1000); TestPutAttributes(); TestPutAttributesWithCondition(); TestBatchPutAttributes(); TestGetAttributes(); TestListDomains(); TestDomainMetadata(); TestSelect(); TestDeleteAttributes(); } finally { TestDeleteDomain(); } } private void TestCreateDomain() { Assert.IsFalse(DoesDomainExist(domainName)); CreateDomain(domainName); bool found = false; for (int retries = 0; retries < 5 && !found; retries++) { Thread.Sleep(1000 * retries); found = DoesDomainExist(domainName); } Assert.IsTrue(found); } private void TestDeleteDomain() { DeleteDomain(domainName); Assert.IsFalse(DoesDomainExist(domainName)); } private void TestListDomains() { var listDomainsResult = Client.ListDomains(new ListDomainsRequest()); List domainNames = listDomainsResult.DomainNames; Assert.IsTrue(domainNames.Contains(domainName)); } private void TestPutAttributes() { PutAttributesRequest request = new PutAttributesRequest() { DomainName = domainName, ItemName = FOO_ITEM.Name, Attributes = FOO_ITEM.Attributes }; Client.PutAttributes(request); assertItemsStoredInDomain(Client, new List { FOO_ITEM }, domainName); } private void TestPutAttributesWithCondition() { PutAttributesRequest request = new PutAttributesRequest() { DomainName = domainName, ItemName = FOO_ITEM.Name, Attributes = new List() { FOO_ITEM.Attributes[0] }, Expected = new UpdateCondition() { Name = FOO_ITEM.Attributes[0].Name, Exists = true, Value = FOO_ITEM.Attributes[0].Value } }; request.Attributes[0].Replace = true; request.Attributes[0].Value = "11"; FOO_ITEM.Attributes[0].Value = "11"; Client.PutAttributes(request); assertItemsStoredInDomain(Client, new List { FOO_ITEM }, domainName); } private void TestBatchPutAttributes() { BatchPutAttributesRequest request = new BatchPutAttributesRequest() { DomainName = domainName, Items = ITEM_LIST }; Client.BatchPutAttributes(request); assertItemsStoredInDomain(Client, ITEM_LIST, domainName); } private void TestSelect() { SelectRequest request = new SelectRequest() { SelectExpression = "select * from `" + domainName + "`", ConsistentRead = true }; var selectResult = Client.Select(request); AssertItemsPresent(ITEM_LIST, selectResult.Items); AssertItemsPresent(new List { FOO_ITEM }, selectResult.Items); } private void TestDomainMetadata() { System.Threading.Thread.Sleep(5 * 1000); DomainMetadataRequest request = new DomainMetadataRequest() { DomainName = domainName }; var domainMetadataResult = Client.DomainMetadata(request); int expectedItemCount = 0; int expectedAttributeValueCount = 0; int expectedAttributeNameCount = 0; foreach (ReplaceableItem item in ALL_TEST_DATA) { expectedItemCount++; expectedAttributeNameCount += item.Attributes.Count; expectedAttributeValueCount += item.Attributes.Count; } Assert.AreEqual(expectedItemCount, domainMetadataResult.ItemCount); Assert.AreEqual(expectedAttributeNameCount, domainMetadataResult.AttributeNameCount); Assert.AreEqual(expectedAttributeValueCount, domainMetadataResult.AttributeValueCount); Assert.IsNotNull(domainMetadataResult.Timestamp); } private void TestGetAttributes() { GetAttributesRequest request = new GetAttributesRequest() { DomainName = domainName, ItemName = FOO_ITEM.Name, AttributeNames = new List() { FOO_ITEM.Attributes[0].Name, FOO_ITEM.Attributes[1].Name }, ConsistentRead = true }; var getAttributesResult = Client.GetAttributes(request); List attributes = getAttributesResult.Attributes; Dictionary attributeValuesByName = ConvertAttributesToMap(attributes); Assert.AreEqual(2, attributeValuesByName.Count); List attrs = new List(); attrs.Add(FOO_ITEM.Attributes[0]); attrs.Add(FOO_ITEM.Attributes[1]); foreach (ReplaceableAttribute expectedAttribute in attrs) { string expectedAttributeName = expectedAttribute.Name; Assert.IsTrue(attributeValuesByName.ContainsKey(expectedAttributeName)); Assert.AreEqual(expectedAttribute.Value, attributeValuesByName[expectedAttributeName]); } } private void TestDeleteAttributes() { List attributeNames = new List(); attributeNames.Add(FOO_ITEM.Attributes[0].Name); attributeNames.Add(FOO_ITEM.Attributes[1].Name); List attributeList = new List(); foreach (string attributeName in attributeNames) { attributeList.Add(new Amazon.SimpleDB.Model.Attribute() { Name = attributeName }); } Assert.IsTrue(DoAttributesExistForItem(Client, FOO_ITEM.Name, domainName, attributeNames)); DeleteAttributesRequest request = new DeleteAttributesRequest() { DomainName = domainName, ItemName = FOO_ITEM.Name, Attributes = attributeList }; Client.DeleteAttributes(request); Assert.IsFalse(DoAttributesExistForItem(Client, FOO_ITEM.Name, domainName, attributeNames)); } bool DoesDomainExist(String domainName) { try { DomainMetadataRequest request = new DomainMetadataRequest() { DomainName = domainName }; Client.DomainMetadata(request); return true; } catch (AmazonSimpleDBException) { return false; } } void CreateDomain(String domainName) { CreateDomainRequest request = new CreateDomainRequest() { DomainName = domainName }; Client.CreateDomain(request); } bool DoAttributesExistForItem(IAmazonSimpleDB sdb, String itemName, String domainName, List attributeNames) { GetAttributesRequest request = new GetAttributesRequest() { DomainName = domainName, AttributeNames = attributeNames, ItemName = itemName, ConsistentRead = true }; var result = sdb.GetAttributes(request); Dictionary attributeValuesByName = ConvertAttributesToMap(result.Attributes); foreach (string expectedAttributeName in attributeNames) { if (!attributeValuesByName.ContainsKey(expectedAttributeName)) { return false; } } return true; } Dictionary ConvertAttributesToMap(List attributeList) { Dictionary attributeValuesByName = new Dictionary(); foreach (Amazon.SimpleDB.Model.Attribute attribute in attributeList) { attributeValuesByName.Add(attribute.Name, attribute.Value); } return attributeValuesByName; } static void DeleteDomain(String domainName) { DeleteDomainRequest request = new DeleteDomainRequest() { DomainName = domainName, }; Client.DeleteDomain(request); } void assertItemsStoredInDomain(IAmazonSimpleDB sdb, List expectedItems, String domainName) { SelectRequest request = new SelectRequest() { SelectExpression = "select * from `" + domainName + "`", ConsistentRead = true }; var selectResult = Client.Select(request); AssertItemsPresent(expectedItems, selectResult.Items); } void AssertItemsPresent(List expectedItems, List items) { Dictionary> expectedAttributesByItemName = ConvertReplaceableItemListToMap(expectedItems); Dictionary> retrievedAttributesByItemName = ConvertItemListToMap(items); foreach (string expectedItemName in expectedAttributesByItemName.Keys) { Assert.IsTrue(retrievedAttributesByItemName.ContainsKey(expectedItemName)); Dictionary expectedAttributes = expectedAttributesByItemName[expectedItemName]; Dictionary retrievedAttributes = retrievedAttributesByItemName[expectedItemName]; foreach (string expectedAttributeName in expectedAttributes.Keys) { string expectedAttributeValue = expectedAttributes[expectedAttributeName]; Assert.IsTrue(retrievedAttributes.ContainsKey(expectedAttributeName)); Assert.AreEqual(expectedAttributeValue, retrievedAttributes[expectedAttributeName]); } } } private Dictionary> ConvertReplaceableItemListToMap(List items) { Dictionary> attributesByItemName = new Dictionary>(); foreach (ReplaceableItem item in items) { Dictionary attributeValuesByName = new Dictionary(); foreach (ReplaceableAttribute attribute in item.Attributes) { attributeValuesByName.Add(attribute.Name, attribute.Value); } attributesByItemName.Add(item.Name, attributeValuesByName); } return attributesByItemName; } private Dictionary> ConvertItemListToMap(List items) { Dictionary> attributesByItemName = new Dictionary>(); foreach (Item item in items) { attributesByItemName.Add(item.Name, ConvertAttributesToMap(item.Attributes)); } return attributesByItemName; } } }