github.com/ojiry/terraform@v0.8.2-0.20161218223921-e50cec712c4a/builtin/providers/aws/resource_aws_s3_bucket_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"reflect"
     7  	"regexp"
     8  	"strconv"
     9  	"testing"
    10  
    11  	"github.com/hashicorp/terraform/helper/acctest"
    12  	"github.com/hashicorp/terraform/helper/resource"
    13  	"github.com/hashicorp/terraform/terraform"
    14  
    15  	"github.com/aws/aws-sdk-go/aws"
    16  	"github.com/aws/aws-sdk-go/aws/awserr"
    17  	"github.com/aws/aws-sdk-go/service/s3"
    18  	"github.com/hashicorp/terraform/helper/schema"
    19  )
    20  
    21  func TestAccAWSS3Bucket_basic(t *testing.T) {
    22  	rInt := acctest.RandInt()
    23  	arnRegexp := regexp.MustCompile(
    24  		"^arn:aws:s3:::")
    25  
    26  	resource.Test(t, resource.TestCase{
    27  		PreCheck: func() { testAccPreCheck(t) },
    28  		/*
    29  			IDRefreshName:   "aws_s3_bucket.bucket",
    30  			IDRefreshIgnore: []string{"force_destroy"},
    31  		*/
    32  		Providers:    testAccProviders,
    33  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
    34  		Steps: []resource.TestStep{
    35  			{
    36  				Config: testAccAWSS3BucketConfig(rInt),
    37  				Check: resource.ComposeTestCheckFunc(
    38  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    39  					resource.TestCheckResourceAttr(
    40  						"aws_s3_bucket.bucket", "hosted_zone_id", HostedZoneIDForRegion("us-west-2")),
    41  					resource.TestCheckResourceAttr(
    42  						"aws_s3_bucket.bucket", "region", "us-west-2"),
    43  					resource.TestCheckResourceAttr(
    44  						"aws_s3_bucket.bucket", "website_endpoint", ""),
    45  					resource.TestMatchResourceAttr(
    46  						"aws_s3_bucket.bucket", "arn", arnRegexp),
    47  				),
    48  			},
    49  		},
    50  	})
    51  }
    52  
    53  func TestAccAWSS3Bucket_region(t *testing.T) {
    54  	rInt := acctest.RandInt()
    55  
    56  	resource.Test(t, resource.TestCase{
    57  		PreCheck:     func() { testAccPreCheck(t) },
    58  		Providers:    testAccProviders,
    59  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
    60  		Steps: []resource.TestStep{
    61  			{
    62  				Config: testAccAWSS3BucketConfigWithRegion(rInt),
    63  				Check: resource.ComposeTestCheckFunc(
    64  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    65  					resource.TestCheckResourceAttr("aws_s3_bucket.bucket", "region", "eu-west-1"),
    66  				),
    67  			},
    68  		},
    69  	})
    70  }
    71  
    72  func TestAccAWSS3Bucket_acceleration(t *testing.T) {
    73  	rInt := acctest.RandInt()
    74  
    75  	resource.Test(t, resource.TestCase{
    76  		PreCheck:     func() { testAccPreCheck(t) },
    77  		Providers:    testAccProviders,
    78  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
    79  		Steps: []resource.TestStep{
    80  			{
    81  				Config: testAccAWSS3BucketConfigWithAcceleration(rInt),
    82  				Check: resource.ComposeTestCheckFunc(
    83  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    84  					resource.TestCheckResourceAttr(
    85  						"aws_s3_bucket.bucket", "acceleration_status", "Enabled"),
    86  				),
    87  			},
    88  			{
    89  				Config: testAccAWSS3BucketConfigWithoutAcceleration(rInt),
    90  				Check: resource.ComposeTestCheckFunc(
    91  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    92  					resource.TestCheckResourceAttr(
    93  						"aws_s3_bucket.bucket", "acceleration_status", "Suspended"),
    94  				),
    95  			},
    96  		},
    97  	})
    98  }
    99  
   100  func TestAccAWSS3Bucket_RequestPayer(t *testing.T) {
   101  	rInt := acctest.RandInt()
   102  
   103  	resource.Test(t, resource.TestCase{
   104  		PreCheck:     func() { testAccPreCheck(t) },
   105  		Providers:    testAccProviders,
   106  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   107  		Steps: []resource.TestStep{
   108  			{
   109  				Config: testAccAWSS3BucketConfigRequestPayerBucketOwner(rInt),
   110  				Check: resource.ComposeTestCheckFunc(
   111  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   112  					resource.TestCheckResourceAttr(
   113  						"aws_s3_bucket.bucket",
   114  						"request_payer",
   115  						"BucketOwner"),
   116  					testAccCheckAWSS3RequestPayer(
   117  						"aws_s3_bucket.bucket",
   118  						"BucketOwner"),
   119  				),
   120  			},
   121  			{
   122  				Config: testAccAWSS3BucketConfigRequestPayerRequester(rInt),
   123  				Check: resource.ComposeTestCheckFunc(
   124  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   125  					resource.TestCheckResourceAttr(
   126  						"aws_s3_bucket.bucket",
   127  						"request_payer",
   128  						"Requester"),
   129  					testAccCheckAWSS3RequestPayer(
   130  						"aws_s3_bucket.bucket",
   131  						"Requester"),
   132  				),
   133  			},
   134  		},
   135  	})
   136  }
   137  
   138  func TestResourceAWSS3BucketRequestPayer_validation(t *testing.T) {
   139  	_, errors := validateS3BucketRequestPayerType("incorrect", "request_payer")
   140  	if len(errors) == 0 {
   141  		t.Fatalf("Expected to trigger a validation error")
   142  	}
   143  
   144  	var testCases = []struct {
   145  		Value    string
   146  		ErrCount int
   147  	}{
   148  		{
   149  			Value:    "Requester",
   150  			ErrCount: 0,
   151  		},
   152  		{
   153  			Value:    "BucketOwner",
   154  			ErrCount: 0,
   155  		},
   156  	}
   157  
   158  	for _, tc := range testCases {
   159  		_, errors := validateS3BucketRequestPayerType(tc.Value, "request_payer")
   160  		if len(errors) != tc.ErrCount {
   161  			t.Fatalf("Expected not to trigger a validation error")
   162  		}
   163  	}
   164  }
   165  
   166  func TestAccAWSS3Bucket_Policy(t *testing.T) {
   167  	rInt := acctest.RandInt()
   168  
   169  	resource.Test(t, resource.TestCase{
   170  		PreCheck:     func() { testAccPreCheck(t) },
   171  		Providers:    testAccProviders,
   172  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   173  		Steps: []resource.TestStep{
   174  			{
   175  				Config: testAccAWSS3BucketConfigWithPolicy(rInt),
   176  				Check: resource.ComposeTestCheckFunc(
   177  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   178  					testAccCheckAWSS3BucketPolicy(
   179  						"aws_s3_bucket.bucket", testAccAWSS3BucketPolicy(rInt)),
   180  				),
   181  			},
   182  			{
   183  				Config: testAccAWSS3BucketConfig(rInt),
   184  				Check: resource.ComposeTestCheckFunc(
   185  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   186  					testAccCheckAWSS3BucketPolicy(
   187  						"aws_s3_bucket.bucket", ""),
   188  				),
   189  			},
   190  			{
   191  				Config: testAccAWSS3BucketConfigWithEmptyPolicy(rInt),
   192  				Check: resource.ComposeTestCheckFunc(
   193  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   194  					testAccCheckAWSS3BucketPolicy(
   195  						"aws_s3_bucket.bucket", ""),
   196  				),
   197  			},
   198  		},
   199  	})
   200  }
   201  
   202  func TestAccAWSS3Bucket_UpdateAcl(t *testing.T) {
   203  	ri := acctest.RandInt()
   204  	preConfig := fmt.Sprintf(testAccAWSS3BucketConfigWithAcl, ri)
   205  	postConfig := fmt.Sprintf(testAccAWSS3BucketConfigWithAclUpdate, ri)
   206  
   207  	resource.Test(t, resource.TestCase{
   208  		PreCheck:     func() { testAccPreCheck(t) },
   209  		Providers:    testAccProviders,
   210  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   211  		Steps: []resource.TestStep{
   212  			{
   213  				Config: preConfig,
   214  				Check: resource.ComposeTestCheckFunc(
   215  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   216  					resource.TestCheckResourceAttr(
   217  						"aws_s3_bucket.bucket", "acl", "public-read"),
   218  				),
   219  			},
   220  			{
   221  				Config: postConfig,
   222  				Check: resource.ComposeTestCheckFunc(
   223  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   224  					resource.TestCheckResourceAttr(
   225  						"aws_s3_bucket.bucket", "acl", "private"),
   226  				),
   227  			},
   228  		},
   229  	})
   230  }
   231  
   232  func TestAccAWSS3Bucket_Website_Simple(t *testing.T) {
   233  	rInt := acctest.RandInt()
   234  	resource.Test(t, resource.TestCase{
   235  		PreCheck:     func() { testAccPreCheck(t) },
   236  		Providers:    testAccProviders,
   237  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   238  		Steps: []resource.TestStep{
   239  			{
   240  				Config: testAccAWSS3BucketWebsiteConfig(rInt),
   241  				Check: resource.ComposeTestCheckFunc(
   242  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   243  					testAccCheckAWSS3BucketWebsite(
   244  						"aws_s3_bucket.bucket", "index.html", "", "", ""),
   245  					resource.TestCheckResourceAttr(
   246  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)),
   247  				),
   248  			},
   249  			{
   250  				Config: testAccAWSS3BucketWebsiteConfigWithError(rInt),
   251  				Check: resource.ComposeTestCheckFunc(
   252  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   253  					testAccCheckAWSS3BucketWebsite(
   254  						"aws_s3_bucket.bucket", "index.html", "error.html", "", ""),
   255  					resource.TestCheckResourceAttr(
   256  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)),
   257  				),
   258  			},
   259  			{
   260  				Config: testAccAWSS3BucketConfig(rInt),
   261  				Check: resource.ComposeTestCheckFunc(
   262  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   263  					testAccCheckAWSS3BucketWebsite(
   264  						"aws_s3_bucket.bucket", "", "", "", ""),
   265  					resource.TestCheckResourceAttr(
   266  						"aws_s3_bucket.bucket", "website_endpoint", ""),
   267  				),
   268  			},
   269  		},
   270  	})
   271  }
   272  
   273  func TestAccAWSS3Bucket_WebsiteRedirect(t *testing.T) {
   274  	rInt := acctest.RandInt()
   275  	resource.Test(t, resource.TestCase{
   276  		PreCheck:     func() { testAccPreCheck(t) },
   277  		Providers:    testAccProviders,
   278  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   279  		Steps: []resource.TestStep{
   280  			{
   281  				Config: testAccAWSS3BucketWebsiteConfigWithRedirect(rInt),
   282  				Check: resource.ComposeTestCheckFunc(
   283  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   284  					testAccCheckAWSS3BucketWebsite(
   285  						"aws_s3_bucket.bucket", "", "", "", "hashicorp.com"),
   286  					resource.TestCheckResourceAttr(
   287  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)),
   288  				),
   289  			},
   290  			{
   291  				Config: testAccAWSS3BucketWebsiteConfigWithHttpsRedirect(rInt),
   292  				Check: resource.ComposeTestCheckFunc(
   293  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   294  					testAccCheckAWSS3BucketWebsite(
   295  						"aws_s3_bucket.bucket", "", "", "https", "hashicorp.com"),
   296  					resource.TestCheckResourceAttr(
   297  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)),
   298  				),
   299  			},
   300  			{
   301  				Config: testAccAWSS3BucketConfig(rInt),
   302  				Check: resource.ComposeTestCheckFunc(
   303  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   304  					testAccCheckAWSS3BucketWebsite(
   305  						"aws_s3_bucket.bucket", "", "", "", ""),
   306  					resource.TestCheckResourceAttr(
   307  						"aws_s3_bucket.bucket", "website_endpoint", ""),
   308  				),
   309  			},
   310  		},
   311  	})
   312  }
   313  
   314  func TestAccAWSS3Bucket_WebsiteRoutingRules(t *testing.T) {
   315  	rInt := acctest.RandInt()
   316  	resource.Test(t, resource.TestCase{
   317  		PreCheck:     func() { testAccPreCheck(t) },
   318  		Providers:    testAccProviders,
   319  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   320  		Steps: []resource.TestStep{
   321  			{
   322  				Config: testAccAWSS3BucketWebsiteConfigWithRoutingRules(rInt),
   323  				Check: resource.ComposeTestCheckFunc(
   324  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   325  					testAccCheckAWSS3BucketWebsite(
   326  						"aws_s3_bucket.bucket", "index.html", "error.html", "", ""),
   327  					testAccCheckAWSS3BucketWebsiteRoutingRules(
   328  						"aws_s3_bucket.bucket",
   329  						[]*s3.RoutingRule{
   330  							{
   331  								Condition: &s3.Condition{
   332  									KeyPrefixEquals: aws.String("docs/"),
   333  								},
   334  								Redirect: &s3.Redirect{
   335  									ReplaceKeyPrefixWith: aws.String("documents/"),
   336  								},
   337  							},
   338  						},
   339  					),
   340  					resource.TestCheckResourceAttr(
   341  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)),
   342  				),
   343  			},
   344  			{
   345  				Config: testAccAWSS3BucketConfig(rInt),
   346  				Check: resource.ComposeTestCheckFunc(
   347  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   348  					testAccCheckAWSS3BucketWebsite(
   349  						"aws_s3_bucket.bucket", "", "", "", ""),
   350  					testAccCheckAWSS3BucketWebsiteRoutingRules("aws_s3_bucket.bucket", nil),
   351  					resource.TestCheckResourceAttr(
   352  						"aws_s3_bucket.bucket", "website_endpoint", ""),
   353  				),
   354  			},
   355  		},
   356  	})
   357  }
   358  
   359  // Test TestAccAWSS3Bucket_shouldFailNotFound is designed to fail with a "plan
   360  // not empty" error in Terraform, to check against regresssions.
   361  // See https://github.com/hashicorp/terraform/pull/2925
   362  func TestAccAWSS3Bucket_shouldFailNotFound(t *testing.T) {
   363  	rInt := acctest.RandInt()
   364  	resource.Test(t, resource.TestCase{
   365  		PreCheck:     func() { testAccPreCheck(t) },
   366  		Providers:    testAccProviders,
   367  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   368  		Steps: []resource.TestStep{
   369  			{
   370  				Config: testAccAWSS3BucketDestroyedConfig(rInt),
   371  				Check: resource.ComposeTestCheckFunc(
   372  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   373  					testAccCheckAWSS3DestroyBucket("aws_s3_bucket.bucket"),
   374  				),
   375  				ExpectNonEmptyPlan: true,
   376  			},
   377  		},
   378  	})
   379  }
   380  
   381  func TestAccAWSS3Bucket_Versioning(t *testing.T) {
   382  	rInt := acctest.RandInt()
   383  	resource.Test(t, resource.TestCase{
   384  		PreCheck:     func() { testAccPreCheck(t) },
   385  		Providers:    testAccProviders,
   386  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   387  		Steps: []resource.TestStep{
   388  			{
   389  				Config: testAccAWSS3BucketConfig(rInt),
   390  				Check: resource.ComposeTestCheckFunc(
   391  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   392  					testAccCheckAWSS3BucketVersioning(
   393  						"aws_s3_bucket.bucket", ""),
   394  				),
   395  			},
   396  			{
   397  				Config: testAccAWSS3BucketConfigWithVersioning(rInt),
   398  				Check: resource.ComposeTestCheckFunc(
   399  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   400  					testAccCheckAWSS3BucketVersioning(
   401  						"aws_s3_bucket.bucket", s3.BucketVersioningStatusEnabled),
   402  				),
   403  			},
   404  			{
   405  				Config: testAccAWSS3BucketConfigWithDisableVersioning(rInt),
   406  				Check: resource.ComposeTestCheckFunc(
   407  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   408  					testAccCheckAWSS3BucketVersioning(
   409  						"aws_s3_bucket.bucket", s3.BucketVersioningStatusSuspended),
   410  				),
   411  			},
   412  		},
   413  	})
   414  }
   415  
   416  func TestAccAWSS3Bucket_Cors(t *testing.T) {
   417  	rInt := acctest.RandInt()
   418  
   419  	updateBucketCors := func(n string) resource.TestCheckFunc {
   420  		return func(s *terraform.State) error {
   421  			rs, ok := s.RootModule().Resources[n]
   422  			if !ok {
   423  				return fmt.Errorf("Not found: %s", n)
   424  			}
   425  
   426  			conn := testAccProvider.Meta().(*AWSClient).s3conn
   427  			_, err := conn.PutBucketCors(&s3.PutBucketCorsInput{
   428  				Bucket: aws.String(rs.Primary.ID),
   429  				CORSConfiguration: &s3.CORSConfiguration{
   430  					CORSRules: []*s3.CORSRule{
   431  						{
   432  							AllowedHeaders: []*string{aws.String("*")},
   433  							AllowedMethods: []*string{aws.String("GET")},
   434  							AllowedOrigins: []*string{aws.String("https://www.example.com")},
   435  						},
   436  					},
   437  				},
   438  			})
   439  			if err != nil {
   440  				if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() != "NoSuchCORSConfiguration" {
   441  					return err
   442  				}
   443  			}
   444  			return nil
   445  		}
   446  	}
   447  
   448  	resource.Test(t, resource.TestCase{
   449  		PreCheck:     func() { testAccPreCheck(t) },
   450  		Providers:    testAccProviders,
   451  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   452  		Steps: []resource.TestStep{
   453  			{
   454  				Config: testAccAWSS3BucketConfigWithCORS(rInt),
   455  				Check: resource.ComposeTestCheckFunc(
   456  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   457  					testAccCheckAWSS3BucketCors(
   458  						"aws_s3_bucket.bucket",
   459  						[]*s3.CORSRule{
   460  							{
   461  								AllowedHeaders: []*string{aws.String("*")},
   462  								AllowedMethods: []*string{aws.String("PUT"), aws.String("POST")},
   463  								AllowedOrigins: []*string{aws.String("https://www.example.com")},
   464  								ExposeHeaders:  []*string{aws.String("x-amz-server-side-encryption"), aws.String("ETag")},
   465  								MaxAgeSeconds:  aws.Int64(3000),
   466  							},
   467  						},
   468  					),
   469  					updateBucketCors("aws_s3_bucket.bucket"),
   470  				),
   471  				ExpectNonEmptyPlan: true,
   472  			},
   473  			{
   474  				Config: testAccAWSS3BucketConfigWithCORS(rInt),
   475  				Check: resource.ComposeTestCheckFunc(
   476  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   477  					testAccCheckAWSS3BucketCors(
   478  						"aws_s3_bucket.bucket",
   479  						[]*s3.CORSRule{
   480  							{
   481  								AllowedHeaders: []*string{aws.String("*")},
   482  								AllowedMethods: []*string{aws.String("PUT"), aws.String("POST")},
   483  								AllowedOrigins: []*string{aws.String("https://www.example.com")},
   484  								ExposeHeaders:  []*string{aws.String("x-amz-server-side-encryption"), aws.String("ETag")},
   485  								MaxAgeSeconds:  aws.Int64(3000),
   486  							},
   487  						},
   488  					),
   489  				),
   490  			},
   491  		},
   492  	})
   493  }
   494  
   495  func TestAccAWSS3Bucket_Logging(t *testing.T) {
   496  	rInt := acctest.RandInt()
   497  	resource.Test(t, resource.TestCase{
   498  		PreCheck:     func() { testAccPreCheck(t) },
   499  		Providers:    testAccProviders,
   500  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   501  		Steps: []resource.TestStep{
   502  			{
   503  				Config: testAccAWSS3BucketConfigWithLogging(rInt),
   504  				Check: resource.ComposeTestCheckFunc(
   505  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   506  					testAccCheckAWSS3BucketLogging(
   507  						"aws_s3_bucket.bucket", "aws_s3_bucket.log_bucket", "log/"),
   508  				),
   509  			},
   510  		},
   511  	})
   512  }
   513  
   514  func TestAccAWSS3Bucket_Lifecycle(t *testing.T) {
   515  	rInt := acctest.RandInt()
   516  	resource.Test(t, resource.TestCase{
   517  		PreCheck:     func() { testAccPreCheck(t) },
   518  		Providers:    testAccProviders,
   519  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   520  		Steps: []resource.TestStep{
   521  			{
   522  				Config: testAccAWSS3BucketConfigWithLifecycle(rInt),
   523  				Check: resource.ComposeTestCheckFunc(
   524  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   525  					resource.TestCheckResourceAttr(
   526  						"aws_s3_bucket.bucket", "lifecycle_rule.0.id", "id1"),
   527  					resource.TestCheckResourceAttr(
   528  						"aws_s3_bucket.bucket", "lifecycle_rule.0.prefix", "path1/"),
   529  					resource.TestCheckResourceAttr(
   530  						"aws_s3_bucket.bucket", "lifecycle_rule.0.expiration.2613713285.days", "365"),
   531  					resource.TestCheckResourceAttr(
   532  						"aws_s3_bucket.bucket", "lifecycle_rule.0.expiration.2613713285.date", ""),
   533  					resource.TestCheckResourceAttr(
   534  						"aws_s3_bucket.bucket", "lifecycle_rule.0.expiration.2613713285.expired_object_delete_marker", "false"),
   535  					resource.TestCheckResourceAttr(
   536  						"aws_s3_bucket.bucket", "lifecycle_rule.0.transition.2000431762.date", ""),
   537  					resource.TestCheckResourceAttr(
   538  						"aws_s3_bucket.bucket", "lifecycle_rule.0.transition.2000431762.days", "30"),
   539  					resource.TestCheckResourceAttr(
   540  						"aws_s3_bucket.bucket", "lifecycle_rule.0.transition.2000431762.storage_class", "STANDARD_IA"),
   541  					resource.TestCheckResourceAttr(
   542  						"aws_s3_bucket.bucket", "lifecycle_rule.0.transition.6450812.date", ""),
   543  					resource.TestCheckResourceAttr(
   544  						"aws_s3_bucket.bucket", "lifecycle_rule.0.transition.6450812.days", "60"),
   545  					resource.TestCheckResourceAttr(
   546  						"aws_s3_bucket.bucket", "lifecycle_rule.0.transition.6450812.storage_class", "GLACIER"),
   547  					resource.TestCheckResourceAttr(
   548  						"aws_s3_bucket.bucket", "lifecycle_rule.1.id", "id2"),
   549  					resource.TestCheckResourceAttr(
   550  						"aws_s3_bucket.bucket", "lifecycle_rule.1.prefix", "path2/"),
   551  					resource.TestCheckResourceAttr(
   552  						"aws_s3_bucket.bucket", "lifecycle_rule.1.expiration.2855832418.date", "2016-01-12"),
   553  					resource.TestCheckResourceAttr(
   554  						"aws_s3_bucket.bucket", "lifecycle_rule.1.expiration.2855832418.days", "0"),
   555  					resource.TestCheckResourceAttr(
   556  						"aws_s3_bucket.bucket", "lifecycle_rule.1.expiration.2855832418.expired_object_delete_marker", "false"),
   557  				),
   558  			},
   559  			{
   560  				Config: testAccAWSS3BucketConfigWithVersioningLifecycle(rInt),
   561  				Check: resource.ComposeTestCheckFunc(
   562  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   563  					resource.TestCheckResourceAttr(
   564  						"aws_s3_bucket.bucket", "lifecycle_rule.0.id", "id1"),
   565  					resource.TestCheckResourceAttr(
   566  						"aws_s3_bucket.bucket", "lifecycle_rule.0.prefix", "path1/"),
   567  					resource.TestCheckResourceAttr(
   568  						"aws_s3_bucket.bucket", "lifecycle_rule.0.enabled", "true"),
   569  					resource.TestCheckResourceAttr(
   570  						"aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_expiration.80908210.days", "365"),
   571  					resource.TestCheckResourceAttr(
   572  						"aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.1377917700.days", "30"),
   573  					resource.TestCheckResourceAttr(
   574  						"aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.1377917700.storage_class", "STANDARD_IA"),
   575  					resource.TestCheckResourceAttr(
   576  						"aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.2528035817.days", "60"),
   577  					resource.TestCheckResourceAttr(
   578  						"aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.2528035817.storage_class", "GLACIER"),
   579  					resource.TestCheckResourceAttr(
   580  						"aws_s3_bucket.bucket", "lifecycle_rule.1.id", "id2"),
   581  					resource.TestCheckResourceAttr(
   582  						"aws_s3_bucket.bucket", "lifecycle_rule.1.prefix", "path2/"),
   583  					resource.TestCheckResourceAttr(
   584  						"aws_s3_bucket.bucket", "lifecycle_rule.1.enabled", "false"),
   585  					resource.TestCheckResourceAttr(
   586  						"aws_s3_bucket.bucket", "lifecycle_rule.1.noncurrent_version_expiration.80908210.days", "365"),
   587  				),
   588  			},
   589  			{
   590  				Config: testAccAWSS3BucketConfig(rInt),
   591  				Check: resource.ComposeTestCheckFunc(
   592  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   593  				),
   594  			},
   595  		},
   596  	})
   597  }
   598  
   599  func TestAccAWSS3Bucket_Replication(t *testing.T) {
   600  	rInt := acctest.RandInt()
   601  
   602  	// record the initialized providers so that we can use them to check for the instances in each region
   603  	var providers []*schema.Provider
   604  	providerFactories := map[string]terraform.ResourceProviderFactory{
   605  		"aws": func() (terraform.ResourceProvider, error) {
   606  			p := Provider()
   607  			providers = append(providers, p.(*schema.Provider))
   608  			return p, nil
   609  		},
   610  	}
   611  
   612  	resource.Test(t, resource.TestCase{
   613  		PreCheck:          func() { testAccPreCheck(t) },
   614  		ProviderFactories: providerFactories,
   615  		CheckDestroy:      testAccCheckAWSS3BucketDestroyWithProviders(&providers),
   616  		Steps: []resource.TestStep{
   617  			{
   618  				Config: testAccAWSS3BucketConfigReplication(rInt),
   619  				Check: resource.ComposeTestCheckFunc(
   620  					testAccCheckAWSS3BucketExistsWithProviders("aws_s3_bucket.bucket", &providers),
   621  				),
   622  			},
   623  			{
   624  				Config: testAccAWSS3BucketConfigReplicationWithConfiguration(rInt),
   625  				Check: resource.ComposeTestCheckFunc(
   626  					testAccCheckAWSS3BucketExistsWithProviders("aws_s3_bucket.bucket", &providers),
   627  					resource.TestCheckResourceAttr("aws_s3_bucket.bucket", "replication_configuration.#", "1"),
   628  					resource.TestCheckResourceAttr("aws_s3_bucket.bucket", "replication_configuration.0.rules.#", "1"),
   629  					resource.TestCheckResourceAttr("aws_s3_bucket.bucket", "replication_configuration.0.rules.2229345141.id", "foobar"),
   630  					resource.TestCheckResourceAttr("aws_s3_bucket.bucket", "replication_configuration.0.rules.2229345141.prefix", "foo"),
   631  					resource.TestCheckResourceAttr("aws_s3_bucket.bucket", "replication_configuration.0.rules.2229345141.status", s3.ReplicationRuleStatusEnabled),
   632  				),
   633  			},
   634  		},
   635  	})
   636  }
   637  
   638  func TestAccAWSS3Bucket_ReplicationExpectVersioningValidationError(t *testing.T) {
   639  	rInt := acctest.RandInt()
   640  
   641  	// record the initialized providers so that we can use them to check for the instances in each region
   642  	var providers []*schema.Provider
   643  	providerFactories := map[string]terraform.ResourceProviderFactory{
   644  		"aws": func() (terraform.ResourceProvider, error) {
   645  			p := Provider()
   646  			providers = append(providers, p.(*schema.Provider))
   647  			return p, nil
   648  		},
   649  	}
   650  
   651  	resource.Test(t, resource.TestCase{
   652  		PreCheck:          func() { testAccPreCheck(t) },
   653  		ProviderFactories: providerFactories,
   654  		CheckDestroy:      testAccCheckAWSS3BucketDestroyWithProviders(&providers),
   655  		Steps: []resource.TestStep{
   656  			{
   657  				Config:      testAccAWSS3BucketConfigReplicationNoVersioning(rInt),
   658  				ExpectError: regexp.MustCompile(`versioning must be enabled to allow S3 bucket replication`),
   659  			},
   660  		},
   661  	})
   662  }
   663  
   664  func testAccCheckAWSS3BucketDestroy(s *terraform.State) error {
   665  	return testAccCheckInstanceDestroyWithProvider(s, testAccProvider)
   666  }
   667  
   668  func testAccCheckAWSS3BucketDestroyWithProviders(providers *[]*schema.Provider) resource.TestCheckFunc {
   669  	return func(s *terraform.State) error {
   670  		for _, provider := range *providers {
   671  			if provider.Meta() == nil {
   672  				continue
   673  			}
   674  			if err := testAccCheckAWSS3BucketDestroyWithProvider(s, provider); err != nil {
   675  				return err
   676  			}
   677  		}
   678  		return nil
   679  	}
   680  }
   681  
   682  func testAccCheckAWSS3BucketDestroyWithProvider(s *terraform.State, provider *schema.Provider) error {
   683  	conn := provider.Meta().(*AWSClient).s3conn
   684  
   685  	for _, rs := range s.RootModule().Resources {
   686  		if rs.Type != "aws_s3_bucket" {
   687  			continue
   688  		}
   689  		_, err := conn.DeleteBucket(&s3.DeleteBucketInput{
   690  			Bucket: aws.String(rs.Primary.ID),
   691  		})
   692  		if err != nil {
   693  			if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NoSuchBucket" {
   694  				return nil
   695  			}
   696  			return err
   697  		}
   698  	}
   699  	return nil
   700  }
   701  
   702  func testAccCheckAWSS3BucketExists(n string) resource.TestCheckFunc {
   703  	providers := []*schema.Provider{testAccProvider}
   704  	return testAccCheckAWSS3BucketExistsWithProviders(n, &providers)
   705  }
   706  
   707  func testAccCheckAWSS3BucketExistsWithProviders(n string, providers *[]*schema.Provider) resource.TestCheckFunc {
   708  	return func(s *terraform.State) error {
   709  		rs, ok := s.RootModule().Resources[n]
   710  		if !ok {
   711  			return fmt.Errorf("Not found: %s", n)
   712  		}
   713  
   714  		if rs.Primary.ID == "" {
   715  			return fmt.Errorf("No ID is set")
   716  		}
   717  		for _, provider := range *providers {
   718  			// Ignore if Meta is empty, this can happen for validation providers
   719  			if provider.Meta() == nil {
   720  				continue
   721  			}
   722  
   723  			conn := provider.Meta().(*AWSClient).s3conn
   724  			_, err := conn.HeadBucket(&s3.HeadBucketInput{
   725  				Bucket: aws.String(rs.Primary.ID),
   726  			})
   727  
   728  			if err != nil {
   729  				return fmt.Errorf("S3Bucket error: %v", err)
   730  			}
   731  			return nil
   732  		}
   733  
   734  		return fmt.Errorf("Instance not found")
   735  	}
   736  }
   737  
   738  func testAccCheckAWSS3DestroyBucket(n string) resource.TestCheckFunc {
   739  	return func(s *terraform.State) error {
   740  		rs, ok := s.RootModule().Resources[n]
   741  		if !ok {
   742  			return fmt.Errorf("Not found: %s", n)
   743  		}
   744  
   745  		if rs.Primary.ID == "" {
   746  			return fmt.Errorf("No S3 Bucket ID is set")
   747  		}
   748  
   749  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   750  		_, err := conn.DeleteBucket(&s3.DeleteBucketInput{
   751  			Bucket: aws.String(rs.Primary.ID),
   752  		})
   753  
   754  		if err != nil {
   755  			return fmt.Errorf("Error destroying Bucket (%s) in testAccCheckAWSS3DestroyBucket: %s", rs.Primary.ID, err)
   756  		}
   757  		return nil
   758  	}
   759  }
   760  
   761  func testAccCheckAWSS3BucketPolicy(n string, policy string) resource.TestCheckFunc {
   762  	return func(s *terraform.State) error {
   763  		rs, _ := s.RootModule().Resources[n]
   764  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   765  
   766  		out, err := conn.GetBucketPolicy(&s3.GetBucketPolicyInput{
   767  			Bucket: aws.String(rs.Primary.ID),
   768  		})
   769  
   770  		if policy == "" {
   771  			if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NoSuchBucketPolicy" {
   772  				// expected
   773  				return nil
   774  			}
   775  			if err == nil {
   776  				return fmt.Errorf("Expected no policy, got: %#v", *out.Policy)
   777  			} else {
   778  				return fmt.Errorf("GetBucketPolicy error: %v, expected %s", err, policy)
   779  			}
   780  		}
   781  		if err != nil {
   782  			return fmt.Errorf("GetBucketPolicy error: %v, expected %s", err, policy)
   783  		}
   784  
   785  		if v := out.Policy; v == nil {
   786  			if policy != "" {
   787  				return fmt.Errorf("bad policy, found nil, expected: %s", policy)
   788  			}
   789  		} else {
   790  			expected := make(map[string]interface{})
   791  			if err := json.Unmarshal([]byte(policy), &expected); err != nil {
   792  				return err
   793  			}
   794  			actual := make(map[string]interface{})
   795  			if err := json.Unmarshal([]byte(*v), &actual); err != nil {
   796  				return err
   797  			}
   798  
   799  			if !reflect.DeepEqual(expected, actual) {
   800  				return fmt.Errorf("bad policy, expected: %#v, got %#v", expected, actual)
   801  			}
   802  		}
   803  
   804  		return nil
   805  	}
   806  }
   807  
   808  func testAccCheckAWSS3BucketWebsite(n string, indexDoc string, errorDoc string, redirectProtocol string, redirectTo string) resource.TestCheckFunc {
   809  	return func(s *terraform.State) error {
   810  		rs, _ := s.RootModule().Resources[n]
   811  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   812  
   813  		out, err := conn.GetBucketWebsite(&s3.GetBucketWebsiteInput{
   814  			Bucket: aws.String(rs.Primary.ID),
   815  		})
   816  
   817  		if err != nil {
   818  			if indexDoc == "" {
   819  				// If we want to assert that the website is not there, than
   820  				// this error is expected
   821  				return nil
   822  			} else {
   823  				return fmt.Errorf("S3BucketWebsite error: %v", err)
   824  			}
   825  		}
   826  
   827  		if v := out.IndexDocument; v == nil {
   828  			if indexDoc != "" {
   829  				return fmt.Errorf("bad index doc, found nil, expected: %s", indexDoc)
   830  			}
   831  		} else {
   832  			if *v.Suffix != indexDoc {
   833  				return fmt.Errorf("bad index doc, expected: %s, got %#v", indexDoc, out.IndexDocument)
   834  			}
   835  		}
   836  
   837  		if v := out.ErrorDocument; v == nil {
   838  			if errorDoc != "" {
   839  				return fmt.Errorf("bad error doc, found nil, expected: %s", errorDoc)
   840  			}
   841  		} else {
   842  			if *v.Key != errorDoc {
   843  				return fmt.Errorf("bad error doc, expected: %s, got %#v", errorDoc, out.ErrorDocument)
   844  			}
   845  		}
   846  
   847  		if v := out.RedirectAllRequestsTo; v == nil {
   848  			if redirectTo != "" {
   849  				return fmt.Errorf("bad redirect to, found nil, expected: %s", redirectTo)
   850  			}
   851  		} else {
   852  			if *v.HostName != redirectTo {
   853  				return fmt.Errorf("bad redirect to, expected: %s, got %#v", redirectTo, out.RedirectAllRequestsTo)
   854  			}
   855  			if redirectProtocol != "" && v.Protocol != nil && *v.Protocol != redirectProtocol {
   856  				return fmt.Errorf("bad redirect protocol to, expected: %s, got %#v", redirectProtocol, out.RedirectAllRequestsTo)
   857  			}
   858  		}
   859  
   860  		return nil
   861  	}
   862  }
   863  
   864  func testAccCheckAWSS3BucketWebsiteRoutingRules(n string, routingRules []*s3.RoutingRule) resource.TestCheckFunc {
   865  	return func(s *terraform.State) error {
   866  		rs, _ := s.RootModule().Resources[n]
   867  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   868  
   869  		out, err := conn.GetBucketWebsite(&s3.GetBucketWebsiteInput{
   870  			Bucket: aws.String(rs.Primary.ID),
   871  		})
   872  
   873  		if err != nil {
   874  			if routingRules == nil {
   875  				return nil
   876  			}
   877  			return fmt.Errorf("GetBucketWebsite error: %v", err)
   878  		}
   879  
   880  		if !reflect.DeepEqual(out.RoutingRules, routingRules) {
   881  			return fmt.Errorf("bad routing rule, expected: %v, got %v", routingRules, out.RoutingRules)
   882  		}
   883  
   884  		return nil
   885  	}
   886  }
   887  
   888  func testAccCheckAWSS3BucketVersioning(n string, versioningStatus string) resource.TestCheckFunc {
   889  	return func(s *terraform.State) error {
   890  		rs, _ := s.RootModule().Resources[n]
   891  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   892  
   893  		out, err := conn.GetBucketVersioning(&s3.GetBucketVersioningInput{
   894  			Bucket: aws.String(rs.Primary.ID),
   895  		})
   896  
   897  		if err != nil {
   898  			return fmt.Errorf("GetBucketVersioning error: %v", err)
   899  		}
   900  
   901  		if v := out.Status; v == nil {
   902  			if versioningStatus != "" {
   903  				return fmt.Errorf("bad error versioning status, found nil, expected: %s", versioningStatus)
   904  			}
   905  		} else {
   906  			if *v != versioningStatus {
   907  				return fmt.Errorf("bad error versioning status, expected: %s, got %s", versioningStatus, *v)
   908  			}
   909  		}
   910  
   911  		return nil
   912  	}
   913  }
   914  
   915  func testAccCheckAWSS3BucketCors(n string, corsRules []*s3.CORSRule) resource.TestCheckFunc {
   916  	return func(s *terraform.State) error {
   917  		rs, _ := s.RootModule().Resources[n]
   918  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   919  
   920  		out, err := conn.GetBucketCors(&s3.GetBucketCorsInput{
   921  			Bucket: aws.String(rs.Primary.ID),
   922  		})
   923  
   924  		if err != nil {
   925  			return fmt.Errorf("GetBucketCors error: %v", err)
   926  		}
   927  
   928  		if !reflect.DeepEqual(out.CORSRules, corsRules) {
   929  			return fmt.Errorf("bad error cors rule, expected: %v, got %v", corsRules, out.CORSRules)
   930  		}
   931  
   932  		return nil
   933  	}
   934  }
   935  
   936  func testAccCheckAWSS3RequestPayer(n, expectedPayer string) resource.TestCheckFunc {
   937  	return func(s *terraform.State) error {
   938  		rs, _ := s.RootModule().Resources[n]
   939  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   940  
   941  		out, err := conn.GetBucketRequestPayment(&s3.GetBucketRequestPaymentInput{
   942  			Bucket: aws.String(rs.Primary.ID),
   943  		})
   944  
   945  		if err != nil {
   946  			return fmt.Errorf("GetBucketRequestPayment error: %v", err)
   947  		}
   948  
   949  		if *out.Payer != expectedPayer {
   950  			return fmt.Errorf("bad error request payer type, expected: %v, got %v",
   951  				expectedPayer, out.Payer)
   952  		}
   953  
   954  		return nil
   955  	}
   956  }
   957  
   958  func testAccCheckAWSS3BucketLogging(n, b, p string) resource.TestCheckFunc {
   959  	return func(s *terraform.State) error {
   960  		rs, _ := s.RootModule().Resources[n]
   961  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   962  
   963  		out, err := conn.GetBucketLogging(&s3.GetBucketLoggingInput{
   964  			Bucket: aws.String(rs.Primary.ID),
   965  		})
   966  
   967  		if err != nil {
   968  			return fmt.Errorf("GetBucketLogging error: %v", err)
   969  		}
   970  
   971  		tb, _ := s.RootModule().Resources[b]
   972  
   973  		if v := out.LoggingEnabled.TargetBucket; v == nil {
   974  			if tb.Primary.ID != "" {
   975  				return fmt.Errorf("bad target bucket, found nil, expected: %s", tb.Primary.ID)
   976  			}
   977  		} else {
   978  			if *v != tb.Primary.ID {
   979  				return fmt.Errorf("bad target bucket, expected: %s, got %s", tb.Primary.ID, *v)
   980  			}
   981  		}
   982  
   983  		if v := out.LoggingEnabled.TargetPrefix; v == nil {
   984  			if p != "" {
   985  				return fmt.Errorf("bad target prefix, found nil, expected: %s", p)
   986  			}
   987  		} else {
   988  			if *v != p {
   989  				return fmt.Errorf("bad target prefix, expected: %s, got %s", p, *v)
   990  			}
   991  		}
   992  
   993  		return nil
   994  	}
   995  }
   996  
   997  // These need a bit of randomness as the name can only be used once globally
   998  // within AWS
   999  func testAccWebsiteEndpoint(randInt int) string {
  1000  	return fmt.Sprintf("tf-test-bucket-%d.s3-website-us-west-2.amazonaws.com", randInt)
  1001  }
  1002  
  1003  func testAccAWSS3BucketPolicy(randInt int) string {
  1004  	return fmt.Sprintf(`{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::tf-test-bucket-%d/*" } ] }`, randInt)
  1005  }
  1006  
  1007  func testAccAWSS3BucketConfig(randInt int) string {
  1008  	return fmt.Sprintf(`
  1009  resource "aws_s3_bucket" "bucket" {
  1010  	bucket = "tf-test-bucket-%d"
  1011  	acl = "public-read"
  1012  }
  1013  `, randInt)
  1014  }
  1015  
  1016  func testAccAWSS3BucketConfigWithRegion(randInt int) string {
  1017  	return fmt.Sprintf(`
  1018  provider "aws" {
  1019  	alias = "west"
  1020  	region = "eu-west-1"
  1021  }
  1022  
  1023  resource "aws_s3_bucket" "bucket" {
  1024  	provider = "aws.west"
  1025  	bucket = "tf-test-bucket-%d"
  1026  	region = "eu-west-1"
  1027  }
  1028  `, randInt)
  1029  }
  1030  
  1031  func testAccAWSS3BucketWebsiteConfig(randInt int) string {
  1032  	return fmt.Sprintf(`
  1033  resource "aws_s3_bucket" "bucket" {
  1034  	bucket = "tf-test-bucket-%d"
  1035  	acl = "public-read"
  1036  
  1037  	website {
  1038  		index_document = "index.html"
  1039  	}
  1040  }
  1041  `, randInt)
  1042  }
  1043  
  1044  func testAccAWSS3BucketWebsiteConfigWithError(randInt int) string {
  1045  	return fmt.Sprintf(`
  1046  resource "aws_s3_bucket" "bucket" {
  1047  	bucket = "tf-test-bucket-%d"
  1048  	acl = "public-read"
  1049  
  1050  	website {
  1051  		index_document = "index.html"
  1052  		error_document = "error.html"
  1053  	}
  1054  }
  1055  `, randInt)
  1056  }
  1057  
  1058  func testAccAWSS3BucketWebsiteConfigWithRedirect(randInt int) string {
  1059  	return fmt.Sprintf(`
  1060  resource "aws_s3_bucket" "bucket" {
  1061  	bucket = "tf-test-bucket-%d"
  1062  	acl = "public-read"
  1063  
  1064  	website {
  1065  		redirect_all_requests_to = "hashicorp.com"
  1066  	}
  1067  }
  1068  `, randInt)
  1069  }
  1070  
  1071  func testAccAWSS3BucketWebsiteConfigWithHttpsRedirect(randInt int) string {
  1072  	return fmt.Sprintf(`
  1073  resource "aws_s3_bucket" "bucket" {
  1074  	bucket = "tf-test-bucket-%d"
  1075  	acl = "public-read"
  1076  
  1077  	website {
  1078  		redirect_all_requests_to = "https://hashicorp.com"
  1079  	}
  1080  }
  1081  `, randInt)
  1082  }
  1083  
  1084  func testAccAWSS3BucketWebsiteConfigWithRoutingRules(randInt int) string {
  1085  	return fmt.Sprintf(`
  1086  resource "aws_s3_bucket" "bucket" {
  1087  	bucket = "tf-test-bucket-%d"
  1088  	acl = "public-read"
  1089  
  1090  	website {
  1091  		index_document = "index.html"
  1092  		error_document = "error.html"
  1093  		routing_rules = <<EOF
  1094  [{
  1095  	"Condition": {
  1096  		"KeyPrefixEquals": "docs/"
  1097  	},
  1098  	"Redirect": {
  1099  		"ReplaceKeyPrefixWith": "documents/"
  1100  	}
  1101  }]
  1102  EOF
  1103  	}
  1104  }
  1105  `, randInt)
  1106  }
  1107  
  1108  func testAccAWSS3BucketConfigWithAcceleration(randInt int) string {
  1109  	return fmt.Sprintf(`
  1110  provider "aws" {
  1111  	alias = "west"
  1112  	region = "eu-west-1"
  1113  }
  1114  
  1115  resource "aws_s3_bucket" "bucket" {
  1116  	provider = "aws.west"
  1117  	bucket = "tf-test-bucket-%d"
  1118  	region = "eu-west-1"
  1119  	acl = "public-read"
  1120  	acceleration_status = "Enabled"
  1121  }
  1122  `, randInt)
  1123  }
  1124  
  1125  func testAccAWSS3BucketConfigWithoutAcceleration(randInt int) string {
  1126  	return fmt.Sprintf(`
  1127  provider "aws" {
  1128  	alias = "west"
  1129  	region = "eu-west-1"
  1130  }
  1131  
  1132  resource "aws_s3_bucket" "bucket" {
  1133  	provider = "aws.west"
  1134  	bucket = "tf-test-bucket-%d"
  1135  	region = "eu-west-1"
  1136  	acl = "public-read"
  1137  	acceleration_status = "Suspended"
  1138  }
  1139  `, randInt)
  1140  }
  1141  
  1142  func testAccAWSS3BucketConfigRequestPayerBucketOwner(randInt int) string {
  1143  	return fmt.Sprintf(`
  1144  resource "aws_s3_bucket" "bucket" {
  1145  	bucket = "tf-test-bucket-%d"
  1146  	acl = "public-read"
  1147  	request_payer = "BucketOwner"
  1148  }
  1149  `, randInt)
  1150  }
  1151  
  1152  func testAccAWSS3BucketConfigRequestPayerRequester(randInt int) string {
  1153  	return fmt.Sprintf(`
  1154  resource "aws_s3_bucket" "bucket" {
  1155  	bucket = "tf-test-bucket-%d"
  1156  	acl = "public-read"
  1157  	request_payer = "Requester"
  1158  }
  1159  `, randInt)
  1160  }
  1161  
  1162  func testAccAWSS3BucketConfigWithPolicy(randInt int) string {
  1163  	return fmt.Sprintf(`
  1164  resource "aws_s3_bucket" "bucket" {
  1165  	bucket = "tf-test-bucket-%d"
  1166  	acl = "public-read"
  1167  	policy = %s
  1168  }
  1169  `, randInt, strconv.Quote(testAccAWSS3BucketPolicy(randInt)))
  1170  }
  1171  
  1172  func testAccAWSS3BucketDestroyedConfig(randInt int) string {
  1173  	return fmt.Sprintf(`
  1174  resource "aws_s3_bucket" "bucket" {
  1175  	bucket = "tf-test-bucket-%d"
  1176  	acl = "public-read"
  1177  }
  1178  `, randInt)
  1179  }
  1180  
  1181  func testAccAWSS3BucketConfigWithEmptyPolicy(randInt int) string {
  1182  	return fmt.Sprintf(`
  1183  resource "aws_s3_bucket" "bucket" {
  1184  	bucket = "tf-test-bucket-%d"
  1185  	acl = "public-read"
  1186  	policy = ""
  1187  }
  1188  `, randInt)
  1189  }
  1190  
  1191  func testAccAWSS3BucketConfigWithVersioning(randInt int) string {
  1192  	return fmt.Sprintf(`
  1193  resource "aws_s3_bucket" "bucket" {
  1194  	bucket = "tf-test-bucket-%d"
  1195  	acl = "public-read"
  1196  	versioning {
  1197  	  enabled = true
  1198  	}
  1199  }
  1200  `, randInt)
  1201  }
  1202  
  1203  func testAccAWSS3BucketConfigWithDisableVersioning(randInt int) string {
  1204  	return fmt.Sprintf(`
  1205  resource "aws_s3_bucket" "bucket" {
  1206  	bucket = "tf-test-bucket-%d"
  1207  	acl = "public-read"
  1208  	versioning {
  1209  	  enabled = false
  1210  	}
  1211  }
  1212  `, randInt)
  1213  }
  1214  
  1215  func testAccAWSS3BucketConfigWithCORS(randInt int) string {
  1216  	return fmt.Sprintf(`
  1217  resource "aws_s3_bucket" "bucket" {
  1218  	bucket = "tf-test-bucket-%d"
  1219  	acl = "public-read"
  1220  	cors_rule {
  1221  			allowed_headers = ["*"]
  1222  			allowed_methods = ["PUT","POST"]
  1223  			allowed_origins = ["https://www.example.com"]
  1224  			expose_headers = ["x-amz-server-side-encryption","ETag"]
  1225  			max_age_seconds = 3000
  1226  	}
  1227  }
  1228  `, randInt)
  1229  }
  1230  
  1231  var testAccAWSS3BucketConfigWithAcl = `
  1232  resource "aws_s3_bucket" "bucket" {
  1233  	bucket = "tf-test-bucket-%d"
  1234  	acl = "public-read"
  1235  }
  1236  `
  1237  
  1238  var testAccAWSS3BucketConfigWithAclUpdate = `
  1239  resource "aws_s3_bucket" "bucket" {
  1240  	bucket = "tf-test-bucket-%d"
  1241  	acl = "private"
  1242  }
  1243  `
  1244  
  1245  func testAccAWSS3BucketConfigWithLogging(randInt int) string {
  1246  	return fmt.Sprintf(`
  1247  resource "aws_s3_bucket" "log_bucket" {
  1248  	bucket = "tf-test-log-bucket-%d"
  1249  	acl = "log-delivery-write"
  1250  }
  1251  resource "aws_s3_bucket" "bucket" {
  1252  	bucket = "tf-test-bucket-%d"
  1253  	acl = "private"
  1254  	logging {
  1255  		target_bucket = "${aws_s3_bucket.log_bucket.id}"
  1256  		target_prefix = "log/"
  1257  	}
  1258  }
  1259  `, randInt, randInt)
  1260  }
  1261  
  1262  func testAccAWSS3BucketConfigWithLifecycle(randInt int) string {
  1263  	return fmt.Sprintf(`
  1264  resource "aws_s3_bucket" "bucket" {
  1265  	bucket = "tf-test-bucket-%d"
  1266  	acl = "private"
  1267  	lifecycle_rule {
  1268  		id = "id1"
  1269  		prefix = "path1/"
  1270  		enabled = true
  1271  
  1272  		expiration {
  1273  			days = 365
  1274  		}
  1275  
  1276  		transition {
  1277  			days = 30
  1278  			storage_class = "STANDARD_IA"
  1279  		}
  1280  		transition {
  1281  			days = 60
  1282  			storage_class = "GLACIER"
  1283  		}
  1284  	}
  1285  	lifecycle_rule {
  1286  		id = "id2"
  1287  		prefix = "path2/"
  1288  		enabled = true
  1289  
  1290  		expiration {
  1291  			date = "2016-01-12"
  1292  		}
  1293  	}
  1294  }
  1295  `, randInt)
  1296  }
  1297  
  1298  func testAccAWSS3BucketConfigWithVersioningLifecycle(randInt int) string {
  1299  	return fmt.Sprintf(`
  1300  resource "aws_s3_bucket" "bucket" {
  1301  	bucket = "tf-test-bucket-%d"
  1302  	acl = "private"
  1303  	versioning {
  1304  	  enabled = false
  1305  	}
  1306  	lifecycle_rule {
  1307  		id = "id1"
  1308  		prefix = "path1/"
  1309  		enabled = true
  1310  
  1311  		noncurrent_version_expiration {
  1312  			days = 365
  1313  		}
  1314  		noncurrent_version_transition {
  1315  			days = 30
  1316  			storage_class = "STANDARD_IA"
  1317  		}
  1318  		noncurrent_version_transition {
  1319  			days = 60
  1320  			storage_class = "GLACIER"
  1321  		}
  1322  	}
  1323  	lifecycle_rule {
  1324  		id = "id2"
  1325  		prefix = "path2/"
  1326  		enabled = false
  1327  
  1328  		noncurrent_version_expiration {
  1329  			days = 365
  1330  		}
  1331  	}
  1332  }
  1333  `, randInt)
  1334  }
  1335  
  1336  const testAccAWSS3BucketConfigReplicationBasic = `
  1337  provider "aws" {
  1338    alias  = "euwest"
  1339    region = "eu-west-1"
  1340  }
  1341  
  1342  provider "aws" {
  1343    alias  = "uswest2"
  1344    region = "us-west-2"
  1345  }
  1346  
  1347  resource "aws_iam_role" "role" {
  1348    name               = "tf-iam-role-replication-%d"
  1349    assume_role_policy = <<POLICY
  1350  {
  1351    "Version": "2012-10-17",
  1352    "Statement": [
  1353      {
  1354        "Action": "sts:AssumeRole",
  1355        "Principal": {
  1356          "Service": "s3.amazonaws.com"
  1357        },
  1358        "Effect": "Allow",
  1359        "Sid": ""
  1360      }
  1361    ]
  1362  }
  1363  POLICY
  1364  }
  1365  `
  1366  
  1367  func testAccAWSS3BucketConfigReplication(randInt int) string {
  1368  	return fmt.Sprintf(testAccAWSS3BucketConfigReplicationBasic+`
  1369  resource "aws_s3_bucket" "bucket" {
  1370      provider = "aws.uswest2"
  1371      bucket   = "tf-test-bucket-%d"
  1372      acl      = "private"
  1373  
  1374      versioning {
  1375          enabled = true
  1376      }
  1377  }
  1378  
  1379  resource "aws_s3_bucket" "destination" {
  1380      provider = "aws.euwest"
  1381      bucket   = "tf-test-bucket-destination-%d"
  1382      region   = "eu-west-1"
  1383  
  1384      versioning {
  1385          enabled = true
  1386      }
  1387  }
  1388  `, randInt, randInt, randInt)
  1389  }
  1390  
  1391  func testAccAWSS3BucketConfigReplicationWithConfiguration(randInt int) string {
  1392  	return fmt.Sprintf(testAccAWSS3BucketConfigReplicationBasic+`
  1393  resource "aws_s3_bucket" "bucket" {
  1394      provider = "aws.uswest2"
  1395      bucket   = "tf-test-bucket-%d"
  1396      acl      = "private"
  1397  
  1398      versioning {
  1399          enabled = true
  1400      }
  1401  
  1402      replication_configuration {
  1403          role = "${aws_iam_role.role.arn}"
  1404          rules {
  1405              id     = "foobar"
  1406              prefix = "foo"
  1407              status = "Enabled"
  1408  
  1409              destination {
  1410                  bucket        = "${aws_s3_bucket.destination.arn}"
  1411                  storage_class = "STANDARD"
  1412              }
  1413          }
  1414      }
  1415  }
  1416  
  1417  resource "aws_s3_bucket" "destination" {
  1418      provider = "aws.euwest"
  1419      bucket   = "tf-test-bucket-destination-%d"
  1420      region   = "eu-west-1"
  1421  
  1422      versioning {
  1423          enabled = true
  1424      }
  1425  }
  1426  `, randInt, randInt, randInt)
  1427  }
  1428  
  1429  func testAccAWSS3BucketConfigReplicationNoVersioning(randInt int) string {
  1430  	return fmt.Sprintf(testAccAWSS3BucketConfigReplicationBasic+`
  1431  resource "aws_s3_bucket" "bucket" {
  1432      provider = "aws.uswest2"
  1433      bucket   = "tf-test-bucket-%d"
  1434      acl      = "private"
  1435  
  1436      replication_configuration {
  1437          role = "${aws_iam_role.role.arn}"
  1438          rules {
  1439              id     = "foobar"
  1440              prefix = "foo"
  1441              status = "Enabled"
  1442  
  1443              destination {
  1444                  bucket        = "${aws_s3_bucket.destination.arn}"
  1445                  storage_class = "STANDARD"
  1446              }
  1447          }
  1448      }
  1449  }
  1450  
  1451  resource "aws_s3_bucket" "destination" {
  1452      provider = "aws.euwest"
  1453      bucket   = "tf-test-bucket-destination-%d"
  1454      region   = "eu-west-1"
  1455  
  1456      versioning {
  1457          enabled = true
  1458      }
  1459  }
  1460  `, randInt, randInt, randInt)
  1461  }