private static void TestLifecycleFilterPredicate(LifecycleFilterPredicate predicate, AmazonS3Client client = null)
        {
            var filter = new LifecycleFilter()
            {
                LifecycleFilterPredicate = predicate
            };

            var rule = new LifecycleRule
            {
                Filter      = filter,
                Status      = LifecycleRuleStatus.Enabled,
                Transitions = new List <LifecycleTransition>()
                {
                    new LifecycleTransition
                    {
                        Days         = 1,
                        StorageClass = S3StorageClass.Glacier
                    }
                }
            };

            if (client == null)
            {
                client = Client;
            }

            client.PutLifecycleConfiguration(new PutLifecycleConfigurationRequest
            {
                BucketName    = bucketName,
                Configuration = new LifecycleConfiguration
                {
                    Rules = new List <LifecycleRule>
                    {
                        rule
                    }
                }
            });

            var actualConfig = S3TestUtils.WaitForConsistency(() =>
            {
                var res = client.GetLifecycleConfiguration(bucketName);
                return(res.Configuration?.Rules?.Count == 1 ? res.Configuration : null);
            });

            Assert.IsNotNull(actualConfig);
            Assert.IsNotNull(actualConfig.Rules);
            Assert.AreEqual(1, actualConfig.Rules.Count);
            AssertRulesAreEqual(rule, actualConfig.Rules[0]);
        }
        public void LifecycleTest()
        {
            var s3Configuration = Client.GetLifecycleConfiguration(bucketName).Configuration;

            Assert.IsNotNull(s3Configuration);
            Assert.IsNotNull(s3Configuration.Rules);
            Assert.AreEqual(0, s3Configuration.Rules.Count);

            var configuration = new LifecycleConfiguration
            {
                Rules = new List <LifecycleRule>
                {
                    new LifecycleRule
                    {
#pragma warning disable 618
                        Prefix = "rule1-",
#pragma warning restore 618
                        Status     = LifecycleRuleStatus.Enabled,
                        Expiration = new LifecycleRuleExpiration
                        {
                            Days = 2,
                        },
#pragma warning disable 618
                        Transition = new LifecycleTransition
                        {
                            Days         = 1,
                            StorageClass = S3StorageClass.Glacier
                        },
                        NoncurrentVersionTransition = new LifecycleRuleNoncurrentVersionTransition
                        {
                            NoncurrentDays = 14,
                            StorageClass   = S3StorageClass.Glacier
                        },
#pragma warning restore 618
                        AbortIncompleteMultipartUpload = new LifecycleRuleAbortIncompleteMultipartUpload
                        {
                            DaysAfterInitiation = 7
                        }
                    },
                    new LifecycleRule
                    {
#pragma warning disable 618
                        Prefix = "rule2-",
#pragma warning restore 618
                        Expiration = new LifecycleRuleExpiration
                        {
                            Days = 120
                        },
                        Transitions = new List <LifecycleTransition>
                        {
                            new LifecycleTransition
                            {
                                Days         = 30,
                                StorageClass = S3StorageClass.StandardInfrequentAccess
                            },
                            new LifecycleTransition
                            {
                                Days         = 90,
                                StorageClass = S3StorageClass.Glacier
                            }
                        },
                        NoncurrentVersionTransitions = new List <LifecycleRuleNoncurrentVersionTransition>
                        {
                            new LifecycleRuleNoncurrentVersionTransition
                            {
                                NoncurrentDays = 30,
                                StorageClass   = S3StorageClass.StandardInfrequentAccess
                            },
                            new LifecycleRuleNoncurrentVersionTransition
                            {
                                NoncurrentDays = 90,
                                StorageClass   = S3StorageClass.Glacier
                            }
                        }
                    },
                    new LifecycleRule
                    {
#pragma warning disable 618
                        Prefix = "rule3-",
#pragma warning restore 618
                        Expiration = new LifecycleRuleExpiration
                        {
                            ExpiredObjectDeleteMarker = true
                        },
                        Transitions = new List <LifecycleTransition>
                        {
                            new LifecycleTransition
                            {
                                Days         = 30,
                                StorageClass = S3StorageClass.StandardInfrequentAccess
                            },
                            new LifecycleTransition
                            {
                                Days         = 90,
                                StorageClass = S3StorageClass.Glacier
                            }
                        },
                        NoncurrentVersionTransitions = new List <LifecycleRuleNoncurrentVersionTransition>
                        {
                            new LifecycleRuleNoncurrentVersionTransition
                            {
                                NoncurrentDays = 30,
                                StorageClass   = S3StorageClass.StandardInfrequentAccess
                            },
                            new LifecycleRuleNoncurrentVersionTransition
                            {
                                NoncurrentDays = 90,
                                StorageClass   = S3StorageClass.Glacier
                            }
                        }
                    }
                }
            };

            Client.PutLifecycleConfiguration(new PutLifecycleConfigurationRequest
            {
                BucketName    = bucketName,
                Configuration = configuration
            });

            s3Configuration = S3TestUtils.WaitForConsistency(() =>
            {
                var res = Client.GetLifecycleConfiguration(bucketName);
                return(res.Configuration?.Rules?.Count == configuration.Rules.Count ? res.Configuration : null);
            });

            string abortRuleId = null;

            Assert.IsNotNull(s3Configuration);
            Assert.IsNotNull(s3Configuration.Rules);
            Assert.AreEqual(configuration.Rules.Count, s3Configuration.Rules.Count);
            for (int i = 0; i < configuration.Rules.Count; i++)
            {
                var s3Rule = s3Configuration.Rules[i];
                var rule   = configuration.Rules[i];
                Assert.IsNotNull(rule);
                Assert.IsNotNull(s3Rule);
                if (rule.AbortIncompleteMultipartUpload != null)
                {
                    abortRuleId = s3Rule.Id;
                }

                AssertRulesAreEqual(rule, s3Rule);
            }

            var expectedMinAbortDate = DateTime.Now.Date.AddDays(7);
            var initResponse         = Client.InitiateMultipartUpload(new InitiateMultipartUploadRequest
            {
                BucketName = bucketName,
                Key        = "rule1-123",
                CannedACL  = S3CannedACL.PublicRead
            });
            var listResponse = Client.ListParts(bucketName, initResponse.Key, initResponse.UploadId);

            Assert.AreEqual(abortRuleId, initResponse.AbortRuleId);
            Assert.AreEqual(abortRuleId, listResponse.AbortRuleId);
            Assert.AreEqual(initResponse.AbortDate, listResponse.AbortDate);
            Assert.IsTrue(expectedMinAbortDate < initResponse.AbortDate);
        }
        public void LifecycleV2Test()
        {
            var s3Configuration = Client.GetLifecycleConfiguration(bucketName).Configuration;

            Assert.IsNotNull(s3Configuration);
            Assert.IsNotNull(s3Configuration.Rules);
            Assert.AreEqual(0, s3Configuration.Rules.Count);

            var configuration = new LifecycleConfiguration
            {
                Rules = new List <LifecycleRule>
                {
                    new LifecycleRule
                    {
                        Filter = new LifecycleFilter
                        {
                            LifecycleFilterPredicate = new LifecycleAndOperator
                            {
                                Operands = new List <LifecycleFilterPredicate>
                                {
                                    new LifecycleObjectSizeGreaterThanPredicate
                                    {
                                        ObjectSizeGreaterThan = 132000
                                    },
                                    new LifecycleObjectSizeLessThanPredicate
                                    {
                                        ObjectSizeLessThan = 422000
                                    }
                                }
                            }
                        },
                        Transitions = new List <LifecycleTransition>
                        {
                            new LifecycleTransition
                            {
                                Days         = 30,
                                StorageClass = S3StorageClass.StandardInfrequentAccess
                            },
                            new LifecycleTransition
                            {
                                Days         = 90,
                                StorageClass = S3StorageClass.Glacier
                            }
                        }
                    }
                }
            };

            Client.PutLifecycleConfiguration(new PutLifecycleConfigurationRequest
            {
                BucketName    = bucketName,
                Configuration = configuration
            });

            s3Configuration = S3TestUtils.WaitForConsistency(() =>
            {
                var res = Client.GetLifecycleConfiguration(bucketName);
                return(res.Configuration?.Rules?.Count == configuration.Rules.Count ? res.Configuration : null);
            });

            string abortRuleId = null;

            Assert.IsNotNull(s3Configuration);
            Assert.IsNotNull(s3Configuration.Rules);
            Assert.AreEqual(configuration.Rules.Count, s3Configuration.Rules.Count);
            for (int i = 0; i < configuration.Rules.Count; i++)
            {
                var s3Rule = s3Configuration.Rules[i];
                var rule   = configuration.Rules[i];
                Assert.IsNotNull(rule);
                Assert.IsNotNull(s3Rule);
                if (rule.AbortIncompleteMultipartUpload != null)
                {
                    abortRuleId = s3Rule.Id;
                }

                AssertRulesAreEqual(rule, s3Rule);
            }
        }