예제 #1
0
        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);
            }
        }