github.com/jonasi/terraform@v0.6.10-0.20160125170522-e865c342cc1f/builtin/providers/aws/resource_aws_s3_bucket_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"math/rand"
     7  	"reflect"
     8  	"regexp"
     9  	"strconv"
    10  	"testing"
    11  	"time"
    12  
    13  	"github.com/hashicorp/terraform/helper/resource"
    14  	"github.com/hashicorp/terraform/terraform"
    15  
    16  	"github.com/aws/aws-sdk-go/aws"
    17  	"github.com/aws/aws-sdk-go/aws/awserr"
    18  	"github.com/aws/aws-sdk-go/service/s3"
    19  )
    20  
    21  func TestAccAWSS3Bucket_basic(t *testing.T) {
    22  
    23  	arnRegexp := regexp.MustCompile(
    24  		"^arn:aws:s3:::")
    25  
    26  	resource.Test(t, resource.TestCase{
    27  		PreCheck:     func() { testAccPreCheck(t) },
    28  		Providers:    testAccProviders,
    29  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
    30  		Steps: []resource.TestStep{
    31  			resource.TestStep{
    32  				Config: testAccAWSS3BucketConfig,
    33  				Check: resource.ComposeTestCheckFunc(
    34  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    35  					resource.TestCheckResourceAttr(
    36  						"aws_s3_bucket.bucket", "hosted_zone_id", HostedZoneIDForRegion("us-west-2")),
    37  					resource.TestCheckResourceAttr(
    38  						"aws_s3_bucket.bucket", "region", "us-west-2"),
    39  					resource.TestCheckResourceAttr(
    40  						"aws_s3_bucket.bucket", "website_endpoint", ""),
    41  					resource.TestMatchResourceAttr(
    42  						"aws_s3_bucket.bucket", "arn", arnRegexp),
    43  				),
    44  			},
    45  		},
    46  	})
    47  }
    48  
    49  func TestAccAWSS3Bucket_Policy(t *testing.T) {
    50  	resource.Test(t, resource.TestCase{
    51  		PreCheck:     func() { testAccPreCheck(t) },
    52  		Providers:    testAccProviders,
    53  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
    54  		Steps: []resource.TestStep{
    55  			resource.TestStep{
    56  				Config: testAccAWSS3BucketConfigWithPolicy,
    57  				Check: resource.ComposeTestCheckFunc(
    58  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    59  					testAccCheckAWSS3BucketPolicy(
    60  						"aws_s3_bucket.bucket", testAccAWSS3BucketPolicy),
    61  				),
    62  			},
    63  			resource.TestStep{
    64  				Config: testAccAWSS3BucketConfig,
    65  				Check: resource.ComposeTestCheckFunc(
    66  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    67  					testAccCheckAWSS3BucketPolicy(
    68  						"aws_s3_bucket.bucket", ""),
    69  				),
    70  			},
    71  		},
    72  	})
    73  }
    74  
    75  func TestAccAWSS3Bucket_UpdateAcl(t *testing.T) {
    76  
    77  	ri := genRandInt()
    78  	preConfig := fmt.Sprintf(testAccAWSS3BucketConfigWithAcl, ri)
    79  	postConfig := fmt.Sprintf(testAccAWSS3BucketConfigWithAclUpdate, ri)
    80  
    81  	resource.Test(t, resource.TestCase{
    82  		PreCheck:     func() { testAccPreCheck(t) },
    83  		Providers:    testAccProviders,
    84  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
    85  		Steps: []resource.TestStep{
    86  			resource.TestStep{
    87  				Config: preConfig,
    88  				Check: resource.ComposeTestCheckFunc(
    89  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    90  					resource.TestCheckResourceAttr(
    91  						"aws_s3_bucket.bucket", "acl", "public-read"),
    92  				),
    93  			},
    94  			resource.TestStep{
    95  				Config: postConfig,
    96  				Check: resource.ComposeTestCheckFunc(
    97  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    98  					resource.TestCheckResourceAttr(
    99  						"aws_s3_bucket.bucket", "acl", "private"),
   100  				),
   101  			},
   102  		},
   103  	})
   104  }
   105  
   106  func TestAccAWSS3Bucket_Website_Simple(t *testing.T) {
   107  	resource.Test(t, resource.TestCase{
   108  		PreCheck:     func() { testAccPreCheck(t) },
   109  		Providers:    testAccProviders,
   110  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   111  		Steps: []resource.TestStep{
   112  			resource.TestStep{
   113  				Config: testAccAWSS3BucketWebsiteConfig,
   114  				Check: resource.ComposeTestCheckFunc(
   115  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   116  					testAccCheckAWSS3BucketWebsite(
   117  						"aws_s3_bucket.bucket", "index.html", "", "", ""),
   118  					resource.TestCheckResourceAttr(
   119  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint),
   120  				),
   121  			},
   122  			resource.TestStep{
   123  				Config: testAccAWSS3BucketWebsiteConfigWithError,
   124  				Check: resource.ComposeTestCheckFunc(
   125  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   126  					testAccCheckAWSS3BucketWebsite(
   127  						"aws_s3_bucket.bucket", "index.html", "error.html", "", ""),
   128  					resource.TestCheckResourceAttr(
   129  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint),
   130  				),
   131  			},
   132  			resource.TestStep{
   133  				Config: testAccAWSS3BucketConfig,
   134  				Check: resource.ComposeTestCheckFunc(
   135  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   136  					testAccCheckAWSS3BucketWebsite(
   137  						"aws_s3_bucket.bucket", "", "", "", ""),
   138  					resource.TestCheckResourceAttr(
   139  						"aws_s3_bucket.bucket", "website_endpoint", ""),
   140  				),
   141  			},
   142  		},
   143  	})
   144  }
   145  
   146  func TestAccAWSS3Bucket_WebsiteRedirect(t *testing.T) {
   147  	resource.Test(t, resource.TestCase{
   148  		PreCheck:     func() { testAccPreCheck(t) },
   149  		Providers:    testAccProviders,
   150  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   151  		Steps: []resource.TestStep{
   152  			resource.TestStep{
   153  				Config: testAccAWSS3BucketWebsiteConfigWithRedirect,
   154  				Check: resource.ComposeTestCheckFunc(
   155  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   156  					testAccCheckAWSS3BucketWebsite(
   157  						"aws_s3_bucket.bucket", "", "", "", "hashicorp.com"),
   158  					resource.TestCheckResourceAttr(
   159  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint),
   160  				),
   161  			},
   162  			resource.TestStep{
   163  				Config: testAccAWSS3BucketWebsiteConfigWithHttpsRedirect,
   164  				Check: resource.ComposeTestCheckFunc(
   165  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   166  					testAccCheckAWSS3BucketWebsite(
   167  						"aws_s3_bucket.bucket", "", "", "https", "hashicorp.com"),
   168  					resource.TestCheckResourceAttr(
   169  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint),
   170  				),
   171  			},
   172  			resource.TestStep{
   173  				Config: testAccAWSS3BucketConfig,
   174  				Check: resource.ComposeTestCheckFunc(
   175  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   176  					testAccCheckAWSS3BucketWebsite(
   177  						"aws_s3_bucket.bucket", "", "", "", ""),
   178  					resource.TestCheckResourceAttr(
   179  						"aws_s3_bucket.bucket", "website_endpoint", ""),
   180  				),
   181  			},
   182  		},
   183  	})
   184  }
   185  
   186  // Test TestAccAWSS3Bucket_shouldFailNotFound is designed to fail with a "plan
   187  // not empty" error in Terraform, to check against regresssions.
   188  // See https://github.com/hashicorp/terraform/pull/2925
   189  func TestAccAWSS3Bucket_shouldFailNotFound(t *testing.T) {
   190  	resource.Test(t, resource.TestCase{
   191  		PreCheck:     func() { testAccPreCheck(t) },
   192  		Providers:    testAccProviders,
   193  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   194  		Steps: []resource.TestStep{
   195  			resource.TestStep{
   196  				Config: testAccAWSS3BucketDestroyedConfig,
   197  				Check: resource.ComposeTestCheckFunc(
   198  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   199  					testAccCheckAWSS3DestroyBucket("aws_s3_bucket.bucket"),
   200  				),
   201  				ExpectNonEmptyPlan: true,
   202  			},
   203  		},
   204  	})
   205  }
   206  
   207  func TestAccAWSS3Bucket_Versioning(t *testing.T) {
   208  	resource.Test(t, resource.TestCase{
   209  		PreCheck:     func() { testAccPreCheck(t) },
   210  		Providers:    testAccProviders,
   211  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   212  		Steps: []resource.TestStep{
   213  			resource.TestStep{
   214  				Config: testAccAWSS3BucketConfig,
   215  				Check: resource.ComposeTestCheckFunc(
   216  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   217  					testAccCheckAWSS3BucketVersioning(
   218  						"aws_s3_bucket.bucket", ""),
   219  				),
   220  			},
   221  			resource.TestStep{
   222  				Config: testAccAWSS3BucketConfigWithVersioning,
   223  				Check: resource.ComposeTestCheckFunc(
   224  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   225  					testAccCheckAWSS3BucketVersioning(
   226  						"aws_s3_bucket.bucket", s3.BucketVersioningStatusEnabled),
   227  				),
   228  			},
   229  			resource.TestStep{
   230  				Config: testAccAWSS3BucketConfigWithDisableVersioning,
   231  				Check: resource.ComposeTestCheckFunc(
   232  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   233  					testAccCheckAWSS3BucketVersioning(
   234  						"aws_s3_bucket.bucket", s3.BucketVersioningStatusSuspended),
   235  				),
   236  			},
   237  		},
   238  	})
   239  }
   240  
   241  func TestAccAWSS3Bucket_Cors(t *testing.T) {
   242  	resource.Test(t, resource.TestCase{
   243  		PreCheck:     func() { testAccPreCheck(t) },
   244  		Providers:    testAccProviders,
   245  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   246  		Steps: []resource.TestStep{
   247  			resource.TestStep{
   248  				Config: testAccAWSS3BucketConfigWithCORS,
   249  				Check: resource.ComposeTestCheckFunc(
   250  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   251  					testAccCheckAWSS3BucketCors(
   252  						"aws_s3_bucket.bucket",
   253  						[]*s3.CORSRule{
   254  							&s3.CORSRule{
   255  								AllowedHeaders: []*string{aws.String("*")},
   256  								AllowedMethods: []*string{aws.String("PUT"), aws.String("POST")},
   257  								AllowedOrigins: []*string{aws.String("https://www.example.com")},
   258  								ExposeHeaders:  []*string{aws.String("x-amz-server-side-encryption"), aws.String("ETag")},
   259  								MaxAgeSeconds:  aws.Int64(3000),
   260  							},
   261  						},
   262  					),
   263  				),
   264  			},
   265  		},
   266  	})
   267  }
   268  
   269  func TestAccAWSS3Bucket_Logging(t *testing.T) {
   270  	resource.Test(t, resource.TestCase{
   271  		PreCheck:     func() { testAccPreCheck(t) },
   272  		Providers:    testAccProviders,
   273  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   274  		Steps: []resource.TestStep{
   275  			resource.TestStep{
   276  				Config: testAccAWSS3BucketConfigWithLogging,
   277  				Check: resource.ComposeTestCheckFunc(
   278  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   279  					testAccCheckAWSS3BucketLogging(
   280  						"aws_s3_bucket.bucket", "aws_s3_bucket.log_bucket", "log/"),
   281  				),
   282  			},
   283  		},
   284  	})
   285  }
   286  
   287  func testAccCheckAWSS3BucketDestroy(s *terraform.State) error {
   288  	conn := testAccProvider.Meta().(*AWSClient).s3conn
   289  
   290  	for _, rs := range s.RootModule().Resources {
   291  		if rs.Type != "aws_s3_bucket" {
   292  			continue
   293  		}
   294  		_, err := conn.DeleteBucket(&s3.DeleteBucketInput{
   295  			Bucket: aws.String(rs.Primary.ID),
   296  		})
   297  		if err != nil {
   298  			if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NoSuchBucket" {
   299  				return nil
   300  			}
   301  			return err
   302  		}
   303  	}
   304  	return nil
   305  }
   306  
   307  func testAccCheckAWSS3BucketExists(n string) resource.TestCheckFunc {
   308  	return func(s *terraform.State) error {
   309  		rs, ok := s.RootModule().Resources[n]
   310  		if !ok {
   311  			return fmt.Errorf("Not found: %s", n)
   312  		}
   313  
   314  		if rs.Primary.ID == "" {
   315  			return fmt.Errorf("No S3 Bucket ID is set")
   316  		}
   317  
   318  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   319  		_, err := conn.HeadBucket(&s3.HeadBucketInput{
   320  			Bucket: aws.String(rs.Primary.ID),
   321  		})
   322  
   323  		if err != nil {
   324  			return fmt.Errorf("S3Bucket error: %v", err)
   325  		}
   326  		return nil
   327  	}
   328  }
   329  
   330  func testAccCheckAWSS3DestroyBucket(n string) resource.TestCheckFunc {
   331  	return func(s *terraform.State) error {
   332  		rs, ok := s.RootModule().Resources[n]
   333  		if !ok {
   334  			return fmt.Errorf("Not found: %s", n)
   335  		}
   336  
   337  		if rs.Primary.ID == "" {
   338  			return fmt.Errorf("No S3 Bucket ID is set")
   339  		}
   340  
   341  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   342  		_, err := conn.DeleteBucket(&s3.DeleteBucketInput{
   343  			Bucket: aws.String(rs.Primary.ID),
   344  		})
   345  
   346  		if err != nil {
   347  			return fmt.Errorf("Error destroying Bucket (%s) in testAccCheckAWSS3DestroyBucket: %s", rs.Primary.ID, err)
   348  		}
   349  		return nil
   350  	}
   351  }
   352  
   353  func testAccCheckAWSS3BucketPolicy(n string, policy string) resource.TestCheckFunc {
   354  	return func(s *terraform.State) error {
   355  		rs, _ := s.RootModule().Resources[n]
   356  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   357  
   358  		out, err := conn.GetBucketPolicy(&s3.GetBucketPolicyInput{
   359  			Bucket: aws.String(rs.Primary.ID),
   360  		})
   361  
   362  		if err != nil {
   363  			if policy == "" {
   364  				// expected
   365  				return nil
   366  			} else {
   367  				return fmt.Errorf("GetBucketPolicy error: %v, expected %s", err, policy)
   368  			}
   369  		}
   370  
   371  		if v := out.Policy; v == nil {
   372  			if policy != "" {
   373  				return fmt.Errorf("bad policy, found nil, expected: %s", policy)
   374  			}
   375  		} else {
   376  			expected := make(map[string]interface{})
   377  			if err := json.Unmarshal([]byte(policy), &expected); err != nil {
   378  				return err
   379  			}
   380  			actual := make(map[string]interface{})
   381  			if err := json.Unmarshal([]byte(*v), &actual); err != nil {
   382  				return err
   383  			}
   384  
   385  			if !reflect.DeepEqual(expected, actual) {
   386  				return fmt.Errorf("bad policy, expected: %#v, got %#v", expected, actual)
   387  			}
   388  		}
   389  
   390  		return nil
   391  	}
   392  }
   393  func testAccCheckAWSS3BucketWebsite(n string, indexDoc string, errorDoc string, redirectProtocol string, redirectTo string) resource.TestCheckFunc {
   394  	return func(s *terraform.State) error {
   395  		rs, _ := s.RootModule().Resources[n]
   396  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   397  
   398  		out, err := conn.GetBucketWebsite(&s3.GetBucketWebsiteInput{
   399  			Bucket: aws.String(rs.Primary.ID),
   400  		})
   401  
   402  		if err != nil {
   403  			if indexDoc == "" {
   404  				// If we want to assert that the website is not there, than
   405  				// this error is expected
   406  				return nil
   407  			} else {
   408  				return fmt.Errorf("S3BucketWebsite error: %v", err)
   409  			}
   410  		}
   411  
   412  		if v := out.IndexDocument; v == nil {
   413  			if indexDoc != "" {
   414  				return fmt.Errorf("bad index doc, found nil, expected: %s", indexDoc)
   415  			}
   416  		} else {
   417  			if *v.Suffix != indexDoc {
   418  				return fmt.Errorf("bad index doc, expected: %s, got %#v", indexDoc, out.IndexDocument)
   419  			}
   420  		}
   421  
   422  		if v := out.ErrorDocument; v == nil {
   423  			if errorDoc != "" {
   424  				return fmt.Errorf("bad error doc, found nil, expected: %s", errorDoc)
   425  			}
   426  		} else {
   427  			if *v.Key != errorDoc {
   428  				return fmt.Errorf("bad error doc, expected: %s, got %#v", errorDoc, out.ErrorDocument)
   429  			}
   430  		}
   431  
   432  		if v := out.RedirectAllRequestsTo; v == nil {
   433  			if redirectTo != "" {
   434  				return fmt.Errorf("bad redirect to, found nil, expected: %s", redirectTo)
   435  			}
   436  		} else {
   437  			if *v.HostName != redirectTo {
   438  				return fmt.Errorf("bad redirect to, expected: %s, got %#v", redirectTo, out.RedirectAllRequestsTo)
   439  			}
   440  			if redirectProtocol != "" && *v.Protocol != redirectProtocol {
   441  				return fmt.Errorf("bad redirect protocol to, expected: %s, got %#v", redirectProtocol, out.RedirectAllRequestsTo)
   442  			}
   443  		}
   444  
   445  		return nil
   446  	}
   447  }
   448  
   449  func testAccCheckAWSS3BucketVersioning(n string, versioningStatus string) resource.TestCheckFunc {
   450  	return func(s *terraform.State) error {
   451  		rs, _ := s.RootModule().Resources[n]
   452  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   453  
   454  		out, err := conn.GetBucketVersioning(&s3.GetBucketVersioningInput{
   455  			Bucket: aws.String(rs.Primary.ID),
   456  		})
   457  
   458  		if err != nil {
   459  			return fmt.Errorf("GetBucketVersioning error: %v", err)
   460  		}
   461  
   462  		if v := out.Status; v == nil {
   463  			if versioningStatus != "" {
   464  				return fmt.Errorf("bad error versioning status, found nil, expected: %s", versioningStatus)
   465  			}
   466  		} else {
   467  			if *v != versioningStatus {
   468  				return fmt.Errorf("bad error versioning status, expected: %s, got %s", versioningStatus, *v)
   469  			}
   470  		}
   471  
   472  		return nil
   473  	}
   474  }
   475  func testAccCheckAWSS3BucketCors(n string, corsRules []*s3.CORSRule) resource.TestCheckFunc {
   476  	return func(s *terraform.State) error {
   477  		rs, _ := s.RootModule().Resources[n]
   478  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   479  
   480  		out, err := conn.GetBucketCors(&s3.GetBucketCorsInput{
   481  			Bucket: aws.String(rs.Primary.ID),
   482  		})
   483  
   484  		if err != nil {
   485  			return fmt.Errorf("GetBucketCors error: %v", err)
   486  		}
   487  
   488  		if !reflect.DeepEqual(out.CORSRules, corsRules) {
   489  			return fmt.Errorf("bad error cors rule, expected: %v, got %v", corsRules, out.CORSRules)
   490  		}
   491  
   492  		return nil
   493  	}
   494  }
   495  
   496  func testAccCheckAWSS3BucketLogging(n, b, p string) resource.TestCheckFunc {
   497  	return func(s *terraform.State) error {
   498  		rs, _ := s.RootModule().Resources[n]
   499  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   500  
   501  		out, err := conn.GetBucketLogging(&s3.GetBucketLoggingInput{
   502  			Bucket: aws.String(rs.Primary.ID),
   503  		})
   504  
   505  		if err != nil {
   506  			return fmt.Errorf("GetBucketLogging error: %v", err)
   507  		}
   508  
   509  		tb, _ := s.RootModule().Resources[b]
   510  
   511  		if v := out.LoggingEnabled.TargetBucket; v == nil {
   512  			if tb.Primary.ID != "" {
   513  				return fmt.Errorf("bad target bucket, found nil, expected: %s", tb.Primary.ID)
   514  			}
   515  		} else {
   516  			if *v != tb.Primary.ID {
   517  				return fmt.Errorf("bad target bucket, expected: %s, got %s", tb.Primary.ID, *v)
   518  			}
   519  		}
   520  
   521  		if v := out.LoggingEnabled.TargetPrefix; v == nil {
   522  			if p != "" {
   523  				return fmt.Errorf("bad target prefix, found nil, expected: %s", p)
   524  			}
   525  		} else {
   526  			if *v != p {
   527  				return fmt.Errorf("bad target prefix, expected: %s, got %s", p, *v)
   528  			}
   529  		}
   530  
   531  		return nil
   532  	}
   533  }
   534  
   535  // These need a bit of randomness as the name can only be used once globally
   536  // within AWS
   537  var randInt = rand.New(rand.NewSource(time.Now().UnixNano())).Int()
   538  var testAccWebsiteEndpoint = fmt.Sprintf("tf-test-bucket-%d.s3-website-us-west-2.amazonaws.com", randInt)
   539  var testAccAWSS3BucketPolicy = fmt.Sprintf(`{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::tf-test-bucket-%d/*" } ] }`, randInt)
   540  
   541  var testAccAWSS3BucketConfig = fmt.Sprintf(`
   542  resource "aws_s3_bucket" "bucket" {
   543  	bucket = "tf-test-bucket-%d"
   544  	acl = "public-read"
   545  }
   546  `, randInt)
   547  
   548  var testAccAWSS3BucketWebsiteConfig = fmt.Sprintf(`
   549  resource "aws_s3_bucket" "bucket" {
   550  	bucket = "tf-test-bucket-%d"
   551  	acl = "public-read"
   552  
   553  	website {
   554  		index_document = "index.html"
   555  	}
   556  }
   557  `, randInt)
   558  
   559  var testAccAWSS3BucketWebsiteConfigWithError = fmt.Sprintf(`
   560  resource "aws_s3_bucket" "bucket" {
   561  	bucket = "tf-test-bucket-%d"
   562  	acl = "public-read"
   563  
   564  	website {
   565  		index_document = "index.html"
   566  		error_document = "error.html"
   567  	}
   568  }
   569  `, randInt)
   570  
   571  var testAccAWSS3BucketWebsiteConfigWithRedirect = fmt.Sprintf(`
   572  resource "aws_s3_bucket" "bucket" {
   573  	bucket = "tf-test-bucket-%d"
   574  	acl = "public-read"
   575  
   576  	website {
   577  		redirect_all_requests_to = "hashicorp.com"
   578  	}
   579  }
   580  `, randInt)
   581  
   582  var testAccAWSS3BucketWebsiteConfigWithHttpsRedirect = fmt.Sprintf(`
   583  resource "aws_s3_bucket" "bucket" {
   584  	bucket = "tf-test-bucket-%d"
   585  	acl = "public-read"
   586  
   587  	website {
   588  		redirect_all_requests_to = "https://hashicorp.com"
   589  	}
   590  }
   591  `, randInt)
   592  
   593  var testAccAWSS3BucketConfigWithPolicy = fmt.Sprintf(`
   594  resource "aws_s3_bucket" "bucket" {
   595  	bucket = "tf-test-bucket-%d"
   596  	acl = "public-read"
   597  	policy = %s
   598  }
   599  `, randInt, strconv.Quote(testAccAWSS3BucketPolicy))
   600  
   601  var destroyedName = fmt.Sprintf("tf-test-bucket-%d", randInt)
   602  var testAccAWSS3BucketDestroyedConfig = fmt.Sprintf(`
   603  resource "aws_s3_bucket" "bucket" {
   604  	bucket = "%s"
   605  	acl = "public-read"
   606  }
   607  `, destroyedName)
   608  var testAccAWSS3BucketConfigWithVersioning = fmt.Sprintf(`
   609  resource "aws_s3_bucket" "bucket" {
   610  	bucket = "tf-test-bucket-%d"
   611  	acl = "public-read"
   612  	versioning {
   613  	  enabled = true
   614  	}
   615  }
   616  `, randInt)
   617  
   618  var testAccAWSS3BucketConfigWithDisableVersioning = fmt.Sprintf(`
   619  resource "aws_s3_bucket" "bucket" {
   620  	bucket = "tf-test-bucket-%d"
   621  	acl = "public-read"
   622  	versioning {
   623  	  enabled = false
   624  	}
   625  }
   626  `, randInt)
   627  
   628  var testAccAWSS3BucketConfigWithCORS = fmt.Sprintf(`
   629  resource "aws_s3_bucket" "bucket" {
   630  	bucket = "tf-test-bucket-%d"
   631  	acl = "public-read"
   632  	cors_rule {
   633  			allowed_headers = ["*"]
   634  			allowed_methods = ["PUT","POST"]
   635  			allowed_origins = ["https://www.example.com"]
   636  			expose_headers = ["x-amz-server-side-encryption","ETag"]
   637  			max_age_seconds = 3000
   638  	}
   639  }
   640  `, randInt)
   641  
   642  var testAccAWSS3BucketConfigWithAcl = `
   643  resource "aws_s3_bucket" "bucket" {
   644  	bucket = "tf-test-bucket-%d"
   645  	acl = "public-read"
   646  }
   647  `
   648  
   649  var testAccAWSS3BucketConfigWithAclUpdate = `
   650  resource "aws_s3_bucket" "bucket" {
   651  	bucket = "tf-test-bucket-%d"
   652  	acl = "private"
   653  }
   654  `
   655  
   656  var testAccAWSS3BucketConfigWithLogging = fmt.Sprintf(`
   657  resource "aws_s3_bucket" "log_bucket" {
   658  	bucket = "tf-test-log-bucket-%d"
   659  	acl = "log-delivery-write"
   660  }
   661  resource "aws_s3_bucket" "bucket" {
   662  	bucket = "tf-test-bucket-%d"
   663  	acl = "private"
   664  	logging {
   665  		target_bucket = "${aws_s3_bucket.log_bucket.id}"
   666  		target_prefix = "log/"
   667  	}
   668  }
   669  `, randInt, randInt)