func (s *S) TestPutLifecycleConfiguration(c *check.C) {
	testServer.Response(200, nil, "")

	conf := &s3.LifecycleConfiguration{}
	rule := s3.NewLifecycleRule("id", "")
	rule.SetTransitionDays(7)
	conf.AddRule(rule)

	doc, err := xml.Marshal(conf)
	c.Check(err, check.IsNil)

	b := s.s3.Bucket("bucket")
	err = b.PutLifecycleConfiguration(conf)
	c.Assert(err, check.IsNil)

	req := testServer.WaitRequest()
	c.Assert(req.Method, check.Equals, "PUT")
	c.Assert(req.URL.Path, check.Equals, "/bucket/")
	c.Assert(req.Header["Content-Md5"], check.HasLen, 1)
	c.Assert(req.Header["Content-Md5"][0], check.Not(check.Equals), "")
	s.checkLifecycleRequest(c, req)

	// Check we sent the correct xml serialization
	data, err := ioutil.ReadAll(req.Body)
	req.Body.Close()
	c.Assert(err, check.IsNil)
	header := "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
	c.Assert(string(data), check.Equals, header+string(doc))
}
func (s *S) TestGetLifecycleConfiguration(c *check.C) {
	conf := &s3.LifecycleConfiguration{}
	rule := s3.NewLifecycleRule("id", "")
	rule.SetTransitionDays(7)
	conf.AddRule(rule)

	doc, err := xml.Marshal(conf)
	c.Check(err, check.IsNil)

	testServer.Response(200, nil, string(doc))

	b := s.s3.Bucket("bucket")
	conf2, err := b.GetLifecycleConfiguration()
	c.Check(err, check.IsNil)

	req := testServer.WaitRequest()
	c.Assert(req.Method, check.Equals, "GET")
	c.Assert(req.URL.Path, check.Equals, "/bucket/")
	s.checkLifecycleRequest(c, req)
	s.checkLifecycleConfigurationEqual(c, conf, conf2)
}
func (s *S) TestLifecycleConfiguration(c *check.C) {
	date, err := time.Parse(s3.LifecycleRuleDateFormat, "2014-09-10")
	c.Check(err, check.IsNil)

	conf := &s3.LifecycleConfiguration{}

	rule := s3.NewLifecycleRule("transition-days", "/")
	rule.SetTransitionDays(7)
	conf.AddRule(rule)

	rule = s3.NewLifecycleRule("transition-date", "/")
	rule.SetTransitionDate(date)
	conf.AddRule(rule)

	rule = s3.NewLifecycleRule("expiration-days", "")
	rule.SetExpirationDays(1)
	conf.AddRule(rule)

	rule = s3.NewLifecycleRule("expiration-date", "")
	rule.SetExpirationDate(date)
	conf.AddRule(rule)

	rule = s3.NewLifecycleRule("noncurrent-transition", "")
	rule.SetNoncurrentVersionTransitionDays(11)
	conf.AddRule(rule)

	rule = s3.NewLifecycleRule("noncurrent-expiration", "")
	rule.SetNoncurrentVersionExpirationDays(1011)

	// Test Disable() and Enable() toggling
	c.Check(rule.Status, check.Equals, s3.LifecycleRuleStatusEnabled)
	rule.Disable()
	c.Check(rule.Status, check.Equals, s3.LifecycleRuleStatusDisabled)
	rule.Enable()
	c.Check(rule.Status, check.Equals, s3.LifecycleRuleStatusEnabled)
	rule.Disable()
	c.Check(rule.Status, check.Equals, s3.LifecycleRuleStatusDisabled)

	conf.AddRule(rule)

	doc, err := xml.MarshalIndent(conf, "", "  ")
	c.Check(err, check.IsNil)

	expectedDoc := `<LifecycleConfiguration>
  <Rule>
    <ID>transition-days</ID>
    <Prefix>/</Prefix>
    <Status>Enabled</Status>
    <Transition>
      <Days>7</Days>
      <StorageClass>GLACIER</StorageClass>
    </Transition>
  </Rule>
  <Rule>
    <ID>transition-date</ID>
    <Prefix>/</Prefix>
    <Status>Enabled</Status>
    <Transition>
      <Date>2014-09-10</Date>
      <StorageClass>GLACIER</StorageClass>
    </Transition>
  </Rule>
  <Rule>
    <ID>expiration-days</ID>
    <Prefix></Prefix>
    <Status>Enabled</Status>
    <Expiration>
      <Days>1</Days>
    </Expiration>
  </Rule>
  <Rule>
    <ID>expiration-date</ID>
    <Prefix></Prefix>
    <Status>Enabled</Status>
    <Expiration>
      <Date>2014-09-10</Date>
    </Expiration>
  </Rule>
  <Rule>
    <ID>noncurrent-transition</ID>
    <Prefix></Prefix>
    <Status>Enabled</Status>
    <NoncurrentVersionTransition>
      <NoncurrentDays>11</NoncurrentDays>
      <StorageClass>GLACIER</StorageClass>
    </NoncurrentVersionTransition>
  </Rule>
  <Rule>
    <ID>noncurrent-expiration</ID>
    <Prefix></Prefix>
    <Status>Disabled</Status>
    <NoncurrentVersionExpiration>
      <NoncurrentDays>1011</NoncurrentDays>
    </NoncurrentVersionExpiration>
  </Rule>
</LifecycleConfiguration>`

	c.Check(string(doc), check.Equals, expectedDoc)

	// Unmarshalling test
	conf2 := &s3.LifecycleConfiguration{}
	err = xml.Unmarshal(doc, conf2)
	c.Check(err, check.IsNil)
	s.checkLifecycleConfigurationEqual(c, conf, conf2)
}