github.com/anfernee/terraform@v0.6.16-0.20160430000239-06e5085a92f2/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  )
    19  
    20  func TestAccAWSS3Bucket_basic(t *testing.T) {
    21  	rInt := acctest.RandInt()
    22  	arnRegexp := regexp.MustCompile(
    23  		"^arn:aws:s3:::")
    24  
    25  	resource.Test(t, resource.TestCase{
    26  		PreCheck: func() { testAccPreCheck(t) },
    27  		/*
    28  			IDRefreshName:   "aws_s3_bucket.bucket",
    29  			IDRefreshIgnore: []string{"force_destroy"},
    30  		*/
    31  		Providers:    testAccProviders,
    32  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
    33  		Steps: []resource.TestStep{
    34  			resource.TestStep{
    35  				Config: testAccAWSS3BucketConfig(rInt),
    36  				Check: resource.ComposeTestCheckFunc(
    37  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    38  					resource.TestCheckResourceAttr(
    39  						"aws_s3_bucket.bucket", "hosted_zone_id", HostedZoneIDForRegion("us-west-2")),
    40  					resource.TestCheckResourceAttr(
    41  						"aws_s3_bucket.bucket", "region", "us-west-2"),
    42  					resource.TestCheckResourceAttr(
    43  						"aws_s3_bucket.bucket", "website_endpoint", ""),
    44  					resource.TestMatchResourceAttr(
    45  						"aws_s3_bucket.bucket", "arn", arnRegexp),
    46  				),
    47  			},
    48  		},
    49  	})
    50  }
    51  
    52  func TestAccAWSS3Bucket_Policy(t *testing.T) {
    53  	rInt := acctest.RandInt()
    54  
    55  	resource.Test(t, resource.TestCase{
    56  		PreCheck:     func() { testAccPreCheck(t) },
    57  		Providers:    testAccProviders,
    58  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
    59  		Steps: []resource.TestStep{
    60  			resource.TestStep{
    61  				Config: testAccAWSS3BucketConfigWithPolicy(rInt),
    62  				Check: resource.ComposeTestCheckFunc(
    63  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    64  					testAccCheckAWSS3BucketPolicy(
    65  						"aws_s3_bucket.bucket", testAccAWSS3BucketPolicy(rInt)),
    66  				),
    67  			},
    68  			resource.TestStep{
    69  				Config: testAccAWSS3BucketConfig(rInt),
    70  				Check: resource.ComposeTestCheckFunc(
    71  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    72  					testAccCheckAWSS3BucketPolicy(
    73  						"aws_s3_bucket.bucket", ""),
    74  				),
    75  			},
    76  			resource.TestStep{
    77  				Config: testAccAWSS3BucketConfigWithEmptyPolicy(rInt),
    78  				Check: resource.ComposeTestCheckFunc(
    79  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
    80  					testAccCheckAWSS3BucketPolicy(
    81  						"aws_s3_bucket.bucket", ""),
    82  				),
    83  			},
    84  		},
    85  	})
    86  }
    87  
    88  func TestAccAWSS3Bucket_UpdateAcl(t *testing.T) {
    89  	ri := acctest.RandInt()
    90  	preConfig := fmt.Sprintf(testAccAWSS3BucketConfigWithAcl, ri)
    91  	postConfig := fmt.Sprintf(testAccAWSS3BucketConfigWithAclUpdate, ri)
    92  
    93  	resource.Test(t, resource.TestCase{
    94  		PreCheck:     func() { testAccPreCheck(t) },
    95  		Providers:    testAccProviders,
    96  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
    97  		Steps: []resource.TestStep{
    98  			resource.TestStep{
    99  				Config: preConfig,
   100  				Check: resource.ComposeTestCheckFunc(
   101  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   102  					resource.TestCheckResourceAttr(
   103  						"aws_s3_bucket.bucket", "acl", "public-read"),
   104  				),
   105  			},
   106  			resource.TestStep{
   107  				Config: postConfig,
   108  				Check: resource.ComposeTestCheckFunc(
   109  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   110  					resource.TestCheckResourceAttr(
   111  						"aws_s3_bucket.bucket", "acl", "private"),
   112  				),
   113  			},
   114  		},
   115  	})
   116  }
   117  
   118  func TestAccAWSS3Bucket_Website_Simple(t *testing.T) {
   119  	rInt := acctest.RandInt()
   120  	resource.Test(t, resource.TestCase{
   121  		PreCheck:     func() { testAccPreCheck(t) },
   122  		Providers:    testAccProviders,
   123  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   124  		Steps: []resource.TestStep{
   125  			resource.TestStep{
   126  				Config: testAccAWSS3BucketWebsiteConfig(rInt),
   127  				Check: resource.ComposeTestCheckFunc(
   128  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   129  					testAccCheckAWSS3BucketWebsite(
   130  						"aws_s3_bucket.bucket", "index.html", "", "", ""),
   131  					resource.TestCheckResourceAttr(
   132  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)),
   133  				),
   134  			},
   135  			resource.TestStep{
   136  				Config: testAccAWSS3BucketWebsiteConfigWithError(rInt),
   137  				Check: resource.ComposeTestCheckFunc(
   138  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   139  					testAccCheckAWSS3BucketWebsite(
   140  						"aws_s3_bucket.bucket", "index.html", "error.html", "", ""),
   141  					resource.TestCheckResourceAttr(
   142  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)),
   143  				),
   144  			},
   145  			resource.TestStep{
   146  				Config: testAccAWSS3BucketConfig(rInt),
   147  				Check: resource.ComposeTestCheckFunc(
   148  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   149  					testAccCheckAWSS3BucketWebsite(
   150  						"aws_s3_bucket.bucket", "", "", "", ""),
   151  					resource.TestCheckResourceAttr(
   152  						"aws_s3_bucket.bucket", "website_endpoint", ""),
   153  				),
   154  			},
   155  		},
   156  	})
   157  }
   158  
   159  func TestAccAWSS3Bucket_WebsiteRedirect(t *testing.T) {
   160  	rInt := acctest.RandInt()
   161  	resource.Test(t, resource.TestCase{
   162  		PreCheck:     func() { testAccPreCheck(t) },
   163  		Providers:    testAccProviders,
   164  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   165  		Steps: []resource.TestStep{
   166  			resource.TestStep{
   167  				Config: testAccAWSS3BucketWebsiteConfigWithRedirect(rInt),
   168  				Check: resource.ComposeTestCheckFunc(
   169  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   170  					testAccCheckAWSS3BucketWebsite(
   171  						"aws_s3_bucket.bucket", "", "", "", "hashicorp.com"),
   172  					resource.TestCheckResourceAttr(
   173  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)),
   174  				),
   175  			},
   176  			resource.TestStep{
   177  				Config: testAccAWSS3BucketWebsiteConfigWithHttpsRedirect(rInt),
   178  				Check: resource.ComposeTestCheckFunc(
   179  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   180  					testAccCheckAWSS3BucketWebsite(
   181  						"aws_s3_bucket.bucket", "", "", "https", "hashicorp.com"),
   182  					resource.TestCheckResourceAttr(
   183  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)),
   184  				),
   185  			},
   186  			resource.TestStep{
   187  				Config: testAccAWSS3BucketConfig(rInt),
   188  				Check: resource.ComposeTestCheckFunc(
   189  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   190  					testAccCheckAWSS3BucketWebsite(
   191  						"aws_s3_bucket.bucket", "", "", "", ""),
   192  					resource.TestCheckResourceAttr(
   193  						"aws_s3_bucket.bucket", "website_endpoint", ""),
   194  				),
   195  			},
   196  		},
   197  	})
   198  }
   199  
   200  func TestAccAWSS3Bucket_WebsiteRoutingRules(t *testing.T) {
   201  	rInt := acctest.RandInt()
   202  	resource.Test(t, resource.TestCase{
   203  		PreCheck:     func() { testAccPreCheck(t) },
   204  		Providers:    testAccProviders,
   205  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   206  		Steps: []resource.TestStep{
   207  			resource.TestStep{
   208  				Config: testAccAWSS3BucketWebsiteConfigWithRoutingRules(rInt),
   209  				Check: resource.ComposeTestCheckFunc(
   210  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   211  					testAccCheckAWSS3BucketWebsite(
   212  						"aws_s3_bucket.bucket", "index.html", "error.html", "", ""),
   213  					testAccCheckAWSS3BucketWebsiteRoutingRules(
   214  						"aws_s3_bucket.bucket",
   215  						[]*s3.RoutingRule{
   216  							&s3.RoutingRule{
   217  								Condition: &s3.Condition{
   218  									KeyPrefixEquals: aws.String("docs/"),
   219  								},
   220  								Redirect: &s3.Redirect{
   221  									ReplaceKeyPrefixWith: aws.String("documents/"),
   222  								},
   223  							},
   224  						},
   225  					),
   226  					resource.TestCheckResourceAttr(
   227  						"aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)),
   228  				),
   229  			},
   230  			resource.TestStep{
   231  				Config: testAccAWSS3BucketConfig(rInt),
   232  				Check: resource.ComposeTestCheckFunc(
   233  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   234  					testAccCheckAWSS3BucketWebsite(
   235  						"aws_s3_bucket.bucket", "", "", "", ""),
   236  					testAccCheckAWSS3BucketWebsiteRoutingRules("aws_s3_bucket.bucket", nil),
   237  					resource.TestCheckResourceAttr(
   238  						"aws_s3_bucket.bucket", "website_endpoint", ""),
   239  				),
   240  			},
   241  		},
   242  	})
   243  }
   244  
   245  // Test TestAccAWSS3Bucket_shouldFailNotFound is designed to fail with a "plan
   246  // not empty" error in Terraform, to check against regresssions.
   247  // See https://github.com/hashicorp/terraform/pull/2925
   248  func TestAccAWSS3Bucket_shouldFailNotFound(t *testing.T) {
   249  	rInt := acctest.RandInt()
   250  	resource.Test(t, resource.TestCase{
   251  		PreCheck:     func() { testAccPreCheck(t) },
   252  		Providers:    testAccProviders,
   253  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   254  		Steps: []resource.TestStep{
   255  			resource.TestStep{
   256  				Config: testAccAWSS3BucketDestroyedConfig(rInt),
   257  				Check: resource.ComposeTestCheckFunc(
   258  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   259  					testAccCheckAWSS3DestroyBucket("aws_s3_bucket.bucket"),
   260  				),
   261  				ExpectNonEmptyPlan: true,
   262  			},
   263  		},
   264  	})
   265  }
   266  
   267  func TestAccAWSS3Bucket_Versioning(t *testing.T) {
   268  	rInt := acctest.RandInt()
   269  	resource.Test(t, resource.TestCase{
   270  		PreCheck:     func() { testAccPreCheck(t) },
   271  		Providers:    testAccProviders,
   272  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   273  		Steps: []resource.TestStep{
   274  			resource.TestStep{
   275  				Config: testAccAWSS3BucketConfig(rInt),
   276  				Check: resource.ComposeTestCheckFunc(
   277  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   278  					testAccCheckAWSS3BucketVersioning(
   279  						"aws_s3_bucket.bucket", ""),
   280  				),
   281  			},
   282  			resource.TestStep{
   283  				Config: testAccAWSS3BucketConfigWithVersioning(rInt),
   284  				Check: resource.ComposeTestCheckFunc(
   285  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   286  					testAccCheckAWSS3BucketVersioning(
   287  						"aws_s3_bucket.bucket", s3.BucketVersioningStatusEnabled),
   288  				),
   289  			},
   290  			resource.TestStep{
   291  				Config: testAccAWSS3BucketConfigWithDisableVersioning(rInt),
   292  				Check: resource.ComposeTestCheckFunc(
   293  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   294  					testAccCheckAWSS3BucketVersioning(
   295  						"aws_s3_bucket.bucket", s3.BucketVersioningStatusSuspended),
   296  				),
   297  			},
   298  		},
   299  	})
   300  }
   301  
   302  func TestAccAWSS3Bucket_Cors(t *testing.T) {
   303  	rInt := acctest.RandInt()
   304  	resource.Test(t, resource.TestCase{
   305  		PreCheck:     func() { testAccPreCheck(t) },
   306  		Providers:    testAccProviders,
   307  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   308  		Steps: []resource.TestStep{
   309  			resource.TestStep{
   310  				Config: testAccAWSS3BucketConfigWithCORS(rInt),
   311  				Check: resource.ComposeTestCheckFunc(
   312  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   313  					testAccCheckAWSS3BucketCors(
   314  						"aws_s3_bucket.bucket",
   315  						[]*s3.CORSRule{
   316  							&s3.CORSRule{
   317  								AllowedHeaders: []*string{aws.String("*")},
   318  								AllowedMethods: []*string{aws.String("PUT"), aws.String("POST")},
   319  								AllowedOrigins: []*string{aws.String("https://www.example.com")},
   320  								ExposeHeaders:  []*string{aws.String("x-amz-server-side-encryption"), aws.String("ETag")},
   321  								MaxAgeSeconds:  aws.Int64(3000),
   322  							},
   323  						},
   324  					),
   325  				),
   326  			},
   327  		},
   328  	})
   329  }
   330  
   331  func TestAccAWSS3Bucket_Logging(t *testing.T) {
   332  	rInt := acctest.RandInt()
   333  	resource.Test(t, resource.TestCase{
   334  		PreCheck:     func() { testAccPreCheck(t) },
   335  		Providers:    testAccProviders,
   336  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   337  		Steps: []resource.TestStep{
   338  			resource.TestStep{
   339  				Config: testAccAWSS3BucketConfigWithLogging(rInt),
   340  				Check: resource.ComposeTestCheckFunc(
   341  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   342  					testAccCheckAWSS3BucketLogging(
   343  						"aws_s3_bucket.bucket", "aws_s3_bucket.log_bucket", "log/"),
   344  				),
   345  			},
   346  		},
   347  	})
   348  }
   349  
   350  func TestAccAWSS3Bucket_Lifecycle(t *testing.T) {
   351  	rInt := acctest.RandInt()
   352  	resource.Test(t, resource.TestCase{
   353  		PreCheck:     func() { testAccPreCheck(t) },
   354  		Providers:    testAccProviders,
   355  		CheckDestroy: testAccCheckAWSS3BucketDestroy,
   356  		Steps: []resource.TestStep{
   357  			resource.TestStep{
   358  				Config: testAccAWSS3BucketConfigWithLifecycle(rInt),
   359  				Check: resource.ComposeTestCheckFunc(
   360  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   361  					resource.TestCheckResourceAttr(
   362  						"aws_s3_bucket.bucket", "lifecycle_rule.0.id", "id1"),
   363  					resource.TestCheckResourceAttr(
   364  						"aws_s3_bucket.bucket", "lifecycle_rule.0.prefix", "path1/"),
   365  					resource.TestCheckResourceAttr(
   366  						"aws_s3_bucket.bucket", "lifecycle_rule.0.expiration.2613713285.days", "365"),
   367  					resource.TestCheckResourceAttr(
   368  						"aws_s3_bucket.bucket", "lifecycle_rule.0.expiration.2613713285.date", ""),
   369  					resource.TestCheckResourceAttr(
   370  						"aws_s3_bucket.bucket", "lifecycle_rule.0.expiration.2613713285.expired_object_delete_marker", "false"),
   371  					resource.TestCheckResourceAttr(
   372  						"aws_s3_bucket.bucket", "lifecycle_rule.0.transition.2000431762.date", ""),
   373  					resource.TestCheckResourceAttr(
   374  						"aws_s3_bucket.bucket", "lifecycle_rule.0.transition.2000431762.days", "30"),
   375  					resource.TestCheckResourceAttr(
   376  						"aws_s3_bucket.bucket", "lifecycle_rule.0.transition.2000431762.storage_class", "STANDARD_IA"),
   377  					resource.TestCheckResourceAttr(
   378  						"aws_s3_bucket.bucket", "lifecycle_rule.0.transition.6450812.date", ""),
   379  					resource.TestCheckResourceAttr(
   380  						"aws_s3_bucket.bucket", "lifecycle_rule.0.transition.6450812.days", "60"),
   381  					resource.TestCheckResourceAttr(
   382  						"aws_s3_bucket.bucket", "lifecycle_rule.0.transition.6450812.storage_class", "GLACIER"),
   383  					resource.TestCheckResourceAttr(
   384  						"aws_s3_bucket.bucket", "lifecycle_rule.1.id", "id2"),
   385  					resource.TestCheckResourceAttr(
   386  						"aws_s3_bucket.bucket", "lifecycle_rule.1.prefix", "path2/"),
   387  					resource.TestCheckResourceAttr(
   388  						"aws_s3_bucket.bucket", "lifecycle_rule.1.expiration.2855832418.date", "2016-01-12"),
   389  					resource.TestCheckResourceAttr(
   390  						"aws_s3_bucket.bucket", "lifecycle_rule.1.expiration.2855832418.days", "0"),
   391  					resource.TestCheckResourceAttr(
   392  						"aws_s3_bucket.bucket", "lifecycle_rule.1.expiration.2855832418.expired_object_delete_marker", "false"),
   393  				),
   394  			},
   395  			resource.TestStep{
   396  				Config: testAccAWSS3BucketConfigWithVersioningLifecycle(rInt),
   397  				Check: resource.ComposeTestCheckFunc(
   398  					testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"),
   399  					resource.TestCheckResourceAttr(
   400  						"aws_s3_bucket.bucket", "lifecycle_rule.0.id", "id1"),
   401  					resource.TestCheckResourceAttr(
   402  						"aws_s3_bucket.bucket", "lifecycle_rule.0.prefix", "path1/"),
   403  					resource.TestCheckResourceAttr(
   404  						"aws_s3_bucket.bucket", "lifecycle_rule.0.enabled", "true"),
   405  					resource.TestCheckResourceAttr(
   406  						"aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_expiration.80908210.days", "365"),
   407  					resource.TestCheckResourceAttr(
   408  						"aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.1377917700.days", "30"),
   409  					resource.TestCheckResourceAttr(
   410  						"aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.1377917700.storage_class", "STANDARD_IA"),
   411  					resource.TestCheckResourceAttr(
   412  						"aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.2528035817.days", "60"),
   413  					resource.TestCheckResourceAttr(
   414  						"aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.2528035817.storage_class", "GLACIER"),
   415  					resource.TestCheckResourceAttr(
   416  						"aws_s3_bucket.bucket", "lifecycle_rule.1.id", "id2"),
   417  					resource.TestCheckResourceAttr(
   418  						"aws_s3_bucket.bucket", "lifecycle_rule.1.prefix", "path2/"),
   419  					resource.TestCheckResourceAttr(
   420  						"aws_s3_bucket.bucket", "lifecycle_rule.1.enabled", "false"),
   421  					resource.TestCheckResourceAttr(
   422  						"aws_s3_bucket.bucket", "lifecycle_rule.1.noncurrent_version_expiration.80908210.days", "365"),
   423  				),
   424  			},
   425  		},
   426  	})
   427  }
   428  
   429  func testAccCheckAWSS3BucketDestroy(s *terraform.State) error {
   430  	conn := testAccProvider.Meta().(*AWSClient).s3conn
   431  
   432  	for _, rs := range s.RootModule().Resources {
   433  		if rs.Type != "aws_s3_bucket" {
   434  			continue
   435  		}
   436  		_, err := conn.DeleteBucket(&s3.DeleteBucketInput{
   437  			Bucket: aws.String(rs.Primary.ID),
   438  		})
   439  		if err != nil {
   440  			if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NoSuchBucket" {
   441  				return nil
   442  			}
   443  			return err
   444  		}
   445  	}
   446  	return nil
   447  }
   448  
   449  func testAccCheckAWSS3BucketExists(n string) resource.TestCheckFunc {
   450  	return func(s *terraform.State) error {
   451  		rs, ok := s.RootModule().Resources[n]
   452  		if !ok {
   453  			return fmt.Errorf("Not found: %s", n)
   454  		}
   455  
   456  		if rs.Primary.ID == "" {
   457  			return fmt.Errorf("No S3 Bucket ID is set")
   458  		}
   459  
   460  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   461  		_, err := conn.HeadBucket(&s3.HeadBucketInput{
   462  			Bucket: aws.String(rs.Primary.ID),
   463  		})
   464  
   465  		if err != nil {
   466  			return fmt.Errorf("S3Bucket error: %v", err)
   467  		}
   468  		return nil
   469  	}
   470  }
   471  
   472  func testAccCheckAWSS3DestroyBucket(n string) resource.TestCheckFunc {
   473  	return func(s *terraform.State) error {
   474  		rs, ok := s.RootModule().Resources[n]
   475  		if !ok {
   476  			return fmt.Errorf("Not found: %s", n)
   477  		}
   478  
   479  		if rs.Primary.ID == "" {
   480  			return fmt.Errorf("No S3 Bucket ID is set")
   481  		}
   482  
   483  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   484  		_, err := conn.DeleteBucket(&s3.DeleteBucketInput{
   485  			Bucket: aws.String(rs.Primary.ID),
   486  		})
   487  
   488  		if err != nil {
   489  			return fmt.Errorf("Error destroying Bucket (%s) in testAccCheckAWSS3DestroyBucket: %s", rs.Primary.ID, err)
   490  		}
   491  		return nil
   492  	}
   493  }
   494  
   495  func testAccCheckAWSS3BucketPolicy(n string, policy string) resource.TestCheckFunc {
   496  	return func(s *terraform.State) error {
   497  		rs, _ := s.RootModule().Resources[n]
   498  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   499  
   500  		out, err := conn.GetBucketPolicy(&s3.GetBucketPolicyInput{
   501  			Bucket: aws.String(rs.Primary.ID),
   502  		})
   503  
   504  		if err != nil {
   505  			if policy == "" {
   506  				// expected
   507  				return nil
   508  			} else {
   509  				return fmt.Errorf("GetBucketPolicy error: %v, expected %s", err, policy)
   510  			}
   511  		}
   512  
   513  		if v := out.Policy; v == nil {
   514  			if policy != "" {
   515  				return fmt.Errorf("bad policy, found nil, expected: %s", policy)
   516  			}
   517  		} else {
   518  			expected := make(map[string]interface{})
   519  			if err := json.Unmarshal([]byte(policy), &expected); err != nil {
   520  				return err
   521  			}
   522  			actual := make(map[string]interface{})
   523  			if err := json.Unmarshal([]byte(*v), &actual); err != nil {
   524  				return err
   525  			}
   526  
   527  			if !reflect.DeepEqual(expected, actual) {
   528  				return fmt.Errorf("bad policy, expected: %#v, got %#v", expected, actual)
   529  			}
   530  		}
   531  
   532  		return nil
   533  	}
   534  }
   535  
   536  func testAccCheckAWSS3BucketWebsite(n string, indexDoc string, errorDoc string, redirectProtocol string, redirectTo string) resource.TestCheckFunc {
   537  	return func(s *terraform.State) error {
   538  		rs, _ := s.RootModule().Resources[n]
   539  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   540  
   541  		out, err := conn.GetBucketWebsite(&s3.GetBucketWebsiteInput{
   542  			Bucket: aws.String(rs.Primary.ID),
   543  		})
   544  
   545  		if err != nil {
   546  			if indexDoc == "" {
   547  				// If we want to assert that the website is not there, than
   548  				// this error is expected
   549  				return nil
   550  			} else {
   551  				return fmt.Errorf("S3BucketWebsite error: %v", err)
   552  			}
   553  		}
   554  
   555  		if v := out.IndexDocument; v == nil {
   556  			if indexDoc != "" {
   557  				return fmt.Errorf("bad index doc, found nil, expected: %s", indexDoc)
   558  			}
   559  		} else {
   560  			if *v.Suffix != indexDoc {
   561  				return fmt.Errorf("bad index doc, expected: %s, got %#v", indexDoc, out.IndexDocument)
   562  			}
   563  		}
   564  
   565  		if v := out.ErrorDocument; v == nil {
   566  			if errorDoc != "" {
   567  				return fmt.Errorf("bad error doc, found nil, expected: %s", errorDoc)
   568  			}
   569  		} else {
   570  			if *v.Key != errorDoc {
   571  				return fmt.Errorf("bad error doc, expected: %s, got %#v", errorDoc, out.ErrorDocument)
   572  			}
   573  		}
   574  
   575  		if v := out.RedirectAllRequestsTo; v == nil {
   576  			if redirectTo != "" {
   577  				return fmt.Errorf("bad redirect to, found nil, expected: %s", redirectTo)
   578  			}
   579  		} else {
   580  			if *v.HostName != redirectTo {
   581  				return fmt.Errorf("bad redirect to, expected: %s, got %#v", redirectTo, out.RedirectAllRequestsTo)
   582  			}
   583  			if redirectProtocol != "" && v.Protocol != nil && *v.Protocol != redirectProtocol {
   584  				return fmt.Errorf("bad redirect protocol to, expected: %s, got %#v", redirectProtocol, out.RedirectAllRequestsTo)
   585  			}
   586  		}
   587  
   588  		return nil
   589  	}
   590  }
   591  
   592  func testAccCheckAWSS3BucketWebsiteRoutingRules(n string, routingRules []*s3.RoutingRule) resource.TestCheckFunc {
   593  	return func(s *terraform.State) error {
   594  		rs, _ := s.RootModule().Resources[n]
   595  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   596  
   597  		out, err := conn.GetBucketWebsite(&s3.GetBucketWebsiteInput{
   598  			Bucket: aws.String(rs.Primary.ID),
   599  		})
   600  
   601  		if err != nil {
   602  			if routingRules == nil {
   603  				return nil
   604  			}
   605  			return fmt.Errorf("GetBucketWebsite error: %v", err)
   606  		}
   607  
   608  		if !reflect.DeepEqual(out.RoutingRules, routingRules) {
   609  			return fmt.Errorf("bad routing rule, expected: %v, got %v", routingRules, out.RoutingRules)
   610  		}
   611  
   612  		return nil
   613  	}
   614  }
   615  
   616  func testAccCheckAWSS3BucketVersioning(n string, versioningStatus string) resource.TestCheckFunc {
   617  	return func(s *terraform.State) error {
   618  		rs, _ := s.RootModule().Resources[n]
   619  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   620  
   621  		out, err := conn.GetBucketVersioning(&s3.GetBucketVersioningInput{
   622  			Bucket: aws.String(rs.Primary.ID),
   623  		})
   624  
   625  		if err != nil {
   626  			return fmt.Errorf("GetBucketVersioning error: %v", err)
   627  		}
   628  
   629  		if v := out.Status; v == nil {
   630  			if versioningStatus != "" {
   631  				return fmt.Errorf("bad error versioning status, found nil, expected: %s", versioningStatus)
   632  			}
   633  		} else {
   634  			if *v != versioningStatus {
   635  				return fmt.Errorf("bad error versioning status, expected: %s, got %s", versioningStatus, *v)
   636  			}
   637  		}
   638  
   639  		return nil
   640  	}
   641  }
   642  
   643  func testAccCheckAWSS3BucketCors(n string, corsRules []*s3.CORSRule) resource.TestCheckFunc {
   644  	return func(s *terraform.State) error {
   645  		rs, _ := s.RootModule().Resources[n]
   646  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   647  
   648  		out, err := conn.GetBucketCors(&s3.GetBucketCorsInput{
   649  			Bucket: aws.String(rs.Primary.ID),
   650  		})
   651  
   652  		if err != nil {
   653  			return fmt.Errorf("GetBucketCors error: %v", err)
   654  		}
   655  
   656  		if !reflect.DeepEqual(out.CORSRules, corsRules) {
   657  			return fmt.Errorf("bad error cors rule, expected: %v, got %v", corsRules, out.CORSRules)
   658  		}
   659  
   660  		return nil
   661  	}
   662  }
   663  
   664  func testAccCheckAWSS3BucketLogging(n, b, p string) resource.TestCheckFunc {
   665  	return func(s *terraform.State) error {
   666  		rs, _ := s.RootModule().Resources[n]
   667  		conn := testAccProvider.Meta().(*AWSClient).s3conn
   668  
   669  		out, err := conn.GetBucketLogging(&s3.GetBucketLoggingInput{
   670  			Bucket: aws.String(rs.Primary.ID),
   671  		})
   672  
   673  		if err != nil {
   674  			return fmt.Errorf("GetBucketLogging error: %v", err)
   675  		}
   676  
   677  		tb, _ := s.RootModule().Resources[b]
   678  
   679  		if v := out.LoggingEnabled.TargetBucket; v == nil {
   680  			if tb.Primary.ID != "" {
   681  				return fmt.Errorf("bad target bucket, found nil, expected: %s", tb.Primary.ID)
   682  			}
   683  		} else {
   684  			if *v != tb.Primary.ID {
   685  				return fmt.Errorf("bad target bucket, expected: %s, got %s", tb.Primary.ID, *v)
   686  			}
   687  		}
   688  
   689  		if v := out.LoggingEnabled.TargetPrefix; v == nil {
   690  			if p != "" {
   691  				return fmt.Errorf("bad target prefix, found nil, expected: %s", p)
   692  			}
   693  		} else {
   694  			if *v != p {
   695  				return fmt.Errorf("bad target prefix, expected: %s, got %s", p, *v)
   696  			}
   697  		}
   698  
   699  		return nil
   700  	}
   701  }
   702  
   703  // These need a bit of randomness as the name can only be used once globally
   704  // within AWS
   705  func testAccWebsiteEndpoint(randInt int) string {
   706  	return fmt.Sprintf("tf-test-bucket-%d.s3-website-us-west-2.amazonaws.com", randInt)
   707  }
   708  
   709  func testAccAWSS3BucketPolicy(randInt int) string {
   710  	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)
   711  }
   712  
   713  func testAccAWSS3BucketConfig(randInt int) string {
   714  	return fmt.Sprintf(`
   715  resource "aws_s3_bucket" "bucket" {
   716  	bucket = "tf-test-bucket-%d"
   717  	acl = "public-read"
   718  }
   719  `, randInt)
   720  }
   721  
   722  func testAccAWSS3BucketWebsiteConfig(randInt int) string {
   723  	return fmt.Sprintf(`
   724  resource "aws_s3_bucket" "bucket" {
   725  	bucket = "tf-test-bucket-%d"
   726  	acl = "public-read"
   727  
   728  	website {
   729  		index_document = "index.html"
   730  	}
   731  }
   732  `, randInt)
   733  }
   734  
   735  func testAccAWSS3BucketWebsiteConfigWithError(randInt int) string {
   736  	return fmt.Sprintf(`
   737  resource "aws_s3_bucket" "bucket" {
   738  	bucket = "tf-test-bucket-%d"
   739  	acl = "public-read"
   740  
   741  	website {
   742  		index_document = "index.html"
   743  		error_document = "error.html"
   744  	}
   745  }
   746  `, randInt)
   747  }
   748  
   749  func testAccAWSS3BucketWebsiteConfigWithRedirect(randInt int) string {
   750  	return fmt.Sprintf(`
   751  resource "aws_s3_bucket" "bucket" {
   752  	bucket = "tf-test-bucket-%d"
   753  	acl = "public-read"
   754  
   755  	website {
   756  		redirect_all_requests_to = "hashicorp.com"
   757  	}
   758  }
   759  `, randInt)
   760  }
   761  
   762  func testAccAWSS3BucketWebsiteConfigWithHttpsRedirect(randInt int) string {
   763  	return fmt.Sprintf(`
   764  resource "aws_s3_bucket" "bucket" {
   765  	bucket = "tf-test-bucket-%d"
   766  	acl = "public-read"
   767  
   768  	website {
   769  		redirect_all_requests_to = "https://hashicorp.com"
   770  	}
   771  }
   772  `, randInt)
   773  }
   774  
   775  func testAccAWSS3BucketWebsiteConfigWithRoutingRules(randInt int) string {
   776  	return fmt.Sprintf(`
   777  resource "aws_s3_bucket" "bucket" {
   778  	bucket = "tf-test-bucket-%d"
   779  	acl = "public-read"
   780  
   781  	website {
   782  		index_document = "index.html"
   783  		error_document = "error.html"
   784  		routing_rules = <<EOF
   785  [{
   786  	"Condition": {
   787  		"KeyPrefixEquals": "docs/"
   788  	},
   789  	"Redirect": {
   790  		"ReplaceKeyPrefixWith": "documents/"
   791  	}
   792  }]
   793  EOF
   794  	}
   795  }
   796  `, randInt)
   797  }
   798  
   799  func testAccAWSS3BucketConfigWithPolicy(randInt int) string {
   800  	return fmt.Sprintf(`
   801  resource "aws_s3_bucket" "bucket" {
   802  	bucket = "tf-test-bucket-%d"
   803  	acl = "public-read"
   804  	policy = %s
   805  }
   806  `, randInt, strconv.Quote(testAccAWSS3BucketPolicy(randInt)))
   807  }
   808  
   809  func testAccAWSS3BucketDestroyedConfig(randInt int) string {
   810  	return fmt.Sprintf(`
   811  resource "aws_s3_bucket" "bucket" {
   812  	bucket = "tf-test-bucket-%d"
   813  	acl = "public-read"
   814  }
   815  `, randInt)
   816  }
   817  
   818  func testAccAWSS3BucketConfigWithEmptyPolicy(randInt int) string {
   819  	return fmt.Sprintf(`
   820  resource "aws_s3_bucket" "bucket" {
   821  	bucket = "tf-test-bucket-%d"
   822  	acl = "public-read"
   823  	policy = ""
   824  }
   825  `, randInt)
   826  }
   827  
   828  func testAccAWSS3BucketConfigWithVersioning(randInt int) string {
   829  	return fmt.Sprintf(`
   830  resource "aws_s3_bucket" "bucket" {
   831  	bucket = "tf-test-bucket-%d"
   832  	acl = "public-read"
   833  	versioning {
   834  	  enabled = true
   835  	}
   836  }
   837  `, randInt)
   838  }
   839  
   840  func testAccAWSS3BucketConfigWithDisableVersioning(randInt int) string {
   841  	return fmt.Sprintf(`
   842  resource "aws_s3_bucket" "bucket" {
   843  	bucket = "tf-test-bucket-%d"
   844  	acl = "public-read"
   845  	versioning {
   846  	  enabled = false
   847  	}
   848  }
   849  `, randInt)
   850  }
   851  
   852  func testAccAWSS3BucketConfigWithCORS(randInt int) string {
   853  	return fmt.Sprintf(`
   854  resource "aws_s3_bucket" "bucket" {
   855  	bucket = "tf-test-bucket-%d"
   856  	acl = "public-read"
   857  	cors_rule {
   858  			allowed_headers = ["*"]
   859  			allowed_methods = ["PUT","POST"]
   860  			allowed_origins = ["https://www.example.com"]
   861  			expose_headers = ["x-amz-server-side-encryption","ETag"]
   862  			max_age_seconds = 3000
   863  	}
   864  }
   865  `, randInt)
   866  }
   867  
   868  var testAccAWSS3BucketConfigWithAcl = `
   869  resource "aws_s3_bucket" "bucket" {
   870  	bucket = "tf-test-bucket-%d"
   871  	acl = "public-read"
   872  }
   873  `
   874  
   875  var testAccAWSS3BucketConfigWithAclUpdate = `
   876  resource "aws_s3_bucket" "bucket" {
   877  	bucket = "tf-test-bucket-%d"
   878  	acl = "private"
   879  }
   880  `
   881  
   882  func testAccAWSS3BucketConfigWithLogging(randInt int) string {
   883  	return fmt.Sprintf(`
   884  resource "aws_s3_bucket" "log_bucket" {
   885  	bucket = "tf-test-log-bucket-%d"
   886  	acl = "log-delivery-write"
   887  }
   888  resource "aws_s3_bucket" "bucket" {
   889  	bucket = "tf-test-bucket-%d"
   890  	acl = "private"
   891  	logging {
   892  		target_bucket = "${aws_s3_bucket.log_bucket.id}"
   893  		target_prefix = "log/"
   894  	}
   895  }
   896  `, randInt, randInt)
   897  }
   898  
   899  func testAccAWSS3BucketConfigWithLifecycle(randInt int) string {
   900  	return fmt.Sprintf(`
   901  resource "aws_s3_bucket" "bucket" {
   902  	bucket = "tf-test-bucket-%d"
   903  	acl = "private"
   904  	lifecycle_rule {
   905  		id = "id1"
   906  		prefix = "path1/"
   907  		enabled = true
   908  
   909  		expiration {
   910  			days = 365
   911  		}
   912  
   913  		transition {
   914  			days = 30
   915  			storage_class = "STANDARD_IA"
   916  		}
   917  		transition {
   918  			days = 60
   919  			storage_class = "GLACIER"
   920  		}
   921  	}
   922  	lifecycle_rule {
   923  		id = "id2"
   924  		prefix = "path2/"
   925  		enabled = true
   926  
   927  		expiration {
   928  			date = "2016-01-12"
   929  		}
   930  	}
   931  }
   932  `, randInt)
   933  }
   934  
   935  func testAccAWSS3BucketConfigWithVersioningLifecycle(randInt int) string {
   936  	return fmt.Sprintf(`
   937  resource "aws_s3_bucket" "bucket" {
   938  	bucket = "tf-test-bucket-%d"
   939  	acl = "private"
   940  	versioning {
   941  	  enabled = false
   942  	}
   943  	lifecycle_rule {
   944  		id = "id1"
   945  		prefix = "path1/"
   946  		enabled = true
   947  
   948  		noncurrent_version_expiration {
   949  			days = 365
   950  		}
   951  		noncurrent_version_transition {
   952  			days = 30
   953  			storage_class = "STANDARD_IA"
   954  		}
   955  		noncurrent_version_transition {
   956  			days = 60
   957  			storage_class = "GLACIER"
   958  		}
   959  	}
   960  	lifecycle_rule {
   961  		id = "id2"
   962  		prefix = "path2/"
   963  		enabled = false
   964  
   965  		noncurrent_version_expiration {
   966  			days = 365
   967  		}
   968  	}
   969  }
   970  `, randInt)
   971  }