private async Task TestHashObjects() { string bucketName = "aws-sdk-net-s3link-" + DateTime.Now.Ticks; var s3Client = new Amazon.S3.AmazonS3Client(Amazon.RegionEndpoint.USEast1); await s3Client.PutBucketAsync(bucketName); try { // Create and save item Product product = new Product { Id = 1, Name = "CloudSpotter", CompanyName = "CloudsAreGrate", Price = 1200, TagSet = new HashSet <string> { "Prod", "1.0" }, CurrentStatus = Status.Active, FormerStatus = Status.Upcoming, Supports = Support.Windows | Support.Abacus, PreviousSupport = null, InternalId = "T1000", IsPublic = true, AlwaysN = true, Rating = 4, Components = new List <string> { "Code", "Coffee" }, KeySizes = new List <byte> { 16, 64, 128 }, CompanyInfo = new CompanyInfo { Name = "MyCloud", Founded = new DateTime(1994, 7, 6), Revenue = 9001, AllProducts = new List <Product> { new Product { Id = 12, Name = "CloudDebugger" }, new Product { Id = 13, Name = "CloudDebuggerTester" } }, CompetitorProducts = new Dictionary <string, List <Product> > { { "CloudsAreOK", new List <Product> { new Product { Id = 90, Name = "CloudSpotter RipOff" }, new Product { Id = 100, Name = "CloudDebugger RipOff" }, } }, { "CloudsAreBetter", new List <Product> { new Product { Id = 92, Name = "CloudSpotter RipOff 2" }, new Product { Id = 102, Name = "CloudDebugger RipOff 3" }, } }, } }, Map = new Dictionary <string, string> { { "a", "1" }, { "b", "2" } } }; product.FullProductDescription = S3Link.Create(SharedTestFixture.Context, bucketName, "my-product", Amazon.RegionEndpoint.USEast1); // await product.FullProductDescription.UploadStreamAsync(new MemoryStream(UTF8Encoding.UTF8.GetBytes("Lots of data"))); await SharedTestFixture.Context.SaveAsync(product); // Test conversion var doc = SharedTestFixture.Context.ToDocument(product); Assert.NotNull(doc["Tags"].AsPrimitiveList()); //if (DynamoDBEntryConversion.Schema == DynamoDBEntryConversion.ConversionSchema.V1) // Assert.NotNull(doc["Components"].AsPrimitiveList()); //else // Assert.NotNull(doc["Components"].AsDynamoDBList()); Assert.True( doc["Components"].AsPrimitiveList() != null || doc["Components"].AsDynamoDBList() != null); Assert.NotNull(doc["CompanyInfo"].AsDocument()); Assert.NotNull(doc["Supports"]); // Load item Product retrieved = await SharedTestFixture.Context.LoadAsync <Product>(1); Assert.Equal(product.Id, retrieved.Id); Assert.Equal(product.TagSet.Count, retrieved.TagSet.Count); Assert.Equal(product.Components.Count, retrieved.Components.Count); Assert.Null(retrieved.InternalId); Assert.Equal(product.CurrentStatus, retrieved.CurrentStatus); Assert.Equal(product.FormerStatus, retrieved.FormerStatus); Assert.Equal(product.Supports, retrieved.Supports); Assert.Equal(product.PreviousSupport, retrieved.PreviousSupport); Assert.Equal(product.IsPublic, retrieved.IsPublic); Assert.Equal(product.Rating, retrieved.Rating); Assert.Equal(product.KeySizes.Count, retrieved.KeySizes.Count); Assert.NotNull(retrieved.CompanyInfo); Assert.Equal(product.CompanyInfo.Name, retrieved.CompanyInfo.Name); Assert.Equal(product.CompanyInfo.Founded, retrieved.CompanyInfo.Founded); Assert.NotEqual(product.CompanyInfo.Revenue, retrieved.CompanyInfo.Revenue); Assert.Equal(product.CompanyInfo.AllProducts.Count, retrieved.CompanyInfo.AllProducts.Count); Assert.Equal(product.CompanyInfo.AllProducts[0].Id, retrieved.CompanyInfo.AllProducts[0].Id); Assert.Equal(product.CompanyInfo.AllProducts[1].Id, retrieved.CompanyInfo.AllProducts[1].Id); Assert.Equal(product.Map.Count, retrieved.Map.Count); Assert.Equal(product.CompanyInfo.CompetitorProducts.Count, retrieved.CompanyInfo.CompetitorProducts.Count); var productCloudsAreOkay = product.CompanyInfo.CompetitorProducts["CloudsAreOK"]; var retrievedCloudsAreOkay = retrieved.CompanyInfo.CompetitorProducts["CloudsAreOK"]; Assert.NotNull(productCloudsAreOkay); Assert.NotNull(retrievedCloudsAreOkay); Assert.Equal(productCloudsAreOkay.Count, retrievedCloudsAreOkay.Count); var productCloudsAreBetter = product.CompanyInfo.CompetitorProducts["CloudsAreBetter"]; var retrievedCloudsAreBetter = product.CompanyInfo.CompetitorProducts["CloudsAreBetter"]; Assert.NotNull(productCloudsAreBetter); Assert.NotNull(retrievedCloudsAreBetter); Assert.Equal(productCloudsAreBetter.Count, retrievedCloudsAreBetter.Count); Assert.NotNull(retrieved.FullProductDescription); /*using(var stream = retrieved.FullProductDescription.OpenStream()) * using(var reader = new StreamReader(stream)) * { * Assert.Equal("Lots of data", reader.ReadToEnd()); * }*/ // Try saving circularly-referencing object product.CompanyInfo.AllProducts.Add(product); await Assert.ThrowsAsync <InvalidOperationException>(() => SharedTestFixture.Context.SaveAsync(product)); product.CompanyInfo.AllProducts.RemoveAt(2); // Create and save new item product.Id++; product.Price = 94; product.TagSet = null; product.Components = null; product.CurrentStatus = Status.Upcoming; product.IsPublic = false; product.AlwaysN = false; product.Rating = null; product.KeySizes = null; await SharedTestFixture.Context.SaveAsync(product); // Load new item retrieved = await SharedTestFixture.Context.LoadAsync <Product>(product); Assert.Equal(product.Id, retrieved.Id); Assert.Null(retrieved.TagSet); Assert.Null(retrieved.Components); Assert.Null(retrieved.InternalId); Assert.Equal(product.CurrentStatus, retrieved.CurrentStatus); Assert.Equal(product.IsPublic, retrieved.IsPublic); Assert.Equal(product.AlwaysN, retrieved.AlwaysN); Assert.Equal(product.Rating, retrieved.Rating); Assert.Null(retrieved.KeySizes); // Enumerate all products and save their Ids List <int> productIds = new List <int>(); IEnumerable <Product> products = await SharedTestFixture.Context.ScanAsync <Product>(new List <ScanCondition>()).GetNextSetAsync(); foreach (var p in products) { productIds.Add(p.Id); } Assert.Equal(2, productIds.Count); // Load first product var firstId = productIds[0]; product = await SharedTestFixture.Context.LoadAsync <Product>(firstId); Assert.NotNull(product); Assert.Equal(firstId, product.Id); // Query GlobalIndex products = await SharedTestFixture.Context.QueryAsync <Product>( product.CompanyName, // Hash-key for the index is Company QueryOperator.GreaterThan, // Range-key for the index is Price, so the new object[] { 90 }, // condition is against a numerical value new DynamoDBOperationConfig // Configure the index to use { IndexName = "GlobalIndex", }).GetNextSetAsync(); Assert.Equal(2, products.Count()); // Query GlobalIndex with an additional non-key condition products = await SharedTestFixture.Context.QueryAsync <Product>( product.CompanyName, // Hash-key for the index is Company QueryOperator.GreaterThan, // Range-key for the index is Price, so the new object[] { 90 }, // condition is against a numerical value new DynamoDBOperationConfig // Configure the index to use { IndexName = "GlobalIndex", QueryFilter = new List <ScanCondition> { new ScanCondition("TagSet", ScanOperator.Contains, "1.0") } }).GetNextSetAsync(); Assert.Equal(1, products.Count()); // Delete first product await SharedTestFixture.Context.DeleteAsync <Product>(firstId); product = await SharedTestFixture.Context.LoadAsync <Product>(product.Id); Assert.Null(product); // Scan the table products = await SharedTestFixture.Context.ScanAsync <Product>(new List <ScanCondition>()).GetNextSetAsync(); Assert.Equal(1, products.Count()); // Scan the table with consistent read products = await SharedTestFixture.Context.ScanAsync <Product>( new ScanCondition[] { }, new DynamoDBOperationConfig { ConsistentRead = true }).GetNextSetAsync(); Assert.Equal(1, products.Count()); // Test a versioned product VersionedProduct vp = new VersionedProduct { Id = 3, Name = "CloudDebugger", CompanyName = "CloudsAreGrate", Price = 9000, TagSet = new HashSet <string> { "Test" }, }; await SharedTestFixture.Context.SaveAsync(vp); // Update and save vp.Price++; await SharedTestFixture.Context.SaveAsync(vp); // Alter the version and try to save vp.Version = 0; await Assert.ThrowsAsync <ConditionalCheckFailedException>(() => SharedTestFixture.Context.SaveAsync(vp)); // Load and save vp = await SharedTestFixture.Context.LoadAsync(vp); await SharedTestFixture.Context.SaveAsync(vp); } finally { await UtilityMethods.DeleteBucketWithObjectsAsync(s3Client, bucketName); } }