github.com/markdia/terraform@v0.5.1-0.20150508012022-f1ae920aa970/builtin/providers/aws/resource_aws_s3_bucket_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "math/rand" 6 "testing" 7 "time" 8 9 "github.com/hashicorp/terraform/helper/resource" 10 "github.com/hashicorp/terraform/terraform" 11 12 "github.com/awslabs/aws-sdk-go/aws" 13 "github.com/awslabs/aws-sdk-go/service/s3" 14 ) 15 16 func TestAccAWSS3Bucket_basic(t *testing.T) { 17 resource.Test(t, resource.TestCase{ 18 PreCheck: func() { testAccPreCheck(t) }, 19 Providers: testAccProviders, 20 CheckDestroy: testAccCheckAWSS3BucketDestroy, 21 Steps: []resource.TestStep{ 22 resource.TestStep{ 23 Config: testAccAWSS3BucketConfig, 24 Check: resource.ComposeTestCheckFunc( 25 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 26 resource.TestCheckResourceAttr( 27 "aws_s3_bucket.bucket", "website_endpoint", ""), 28 ), 29 }, 30 }, 31 }) 32 } 33 34 func TestAccAWSS3Bucket_Website(t *testing.T) { 35 resource.Test(t, resource.TestCase{ 36 PreCheck: func() { testAccPreCheck(t) }, 37 Providers: testAccProviders, 38 CheckDestroy: testAccCheckAWSS3BucketDestroy, 39 Steps: []resource.TestStep{ 40 resource.TestStep{ 41 Config: testAccAWSS3BucketWebsiteConfig, 42 Check: resource.ComposeTestCheckFunc( 43 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 44 testAccCheckAWSS3BucketWebsite( 45 "aws_s3_bucket.bucket", "index.html", ""), 46 resource.TestCheckResourceAttr( 47 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint), 48 ), 49 }, 50 resource.TestStep{ 51 Config: testAccAWSS3BucketWebsiteConfigWithError, 52 Check: resource.ComposeTestCheckFunc( 53 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 54 testAccCheckAWSS3BucketWebsite( 55 "aws_s3_bucket.bucket", "index.html", "error.html"), 56 resource.TestCheckResourceAttr( 57 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint), 58 ), 59 }, 60 resource.TestStep{ 61 Config: testAccAWSS3BucketConfig, 62 Check: resource.ComposeTestCheckFunc( 63 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 64 testAccCheckAWSS3BucketWebsite( 65 "aws_s3_bucket.bucket", "", ""), 66 resource.TestCheckResourceAttr( 67 "aws_s3_bucket.bucket", "website_endpoint", ""), 68 ), 69 }, 70 }, 71 }) 72 } 73 74 func testAccCheckAWSS3BucketDestroy(s *terraform.State) error { 75 conn := testAccProvider.Meta().(*AWSClient).s3conn 76 77 for _, rs := range s.RootModule().Resources { 78 if rs.Type != "aws_s3_bucket" { 79 continue 80 } 81 _, err := conn.DeleteBucket(&s3.DeleteBucketInput{ 82 Bucket: aws.String(rs.Primary.ID), 83 }) 84 if err != nil { 85 return err 86 } 87 } 88 return nil 89 } 90 91 func testAccCheckAWSS3BucketExists(n string) resource.TestCheckFunc { 92 return func(s *terraform.State) error { 93 rs, ok := s.RootModule().Resources[n] 94 if !ok { 95 return fmt.Errorf("Not found: %s", n) 96 } 97 98 if rs.Primary.ID == "" { 99 return fmt.Errorf("No S3 Bucket ID is set") 100 } 101 102 conn := testAccProvider.Meta().(*AWSClient).s3conn 103 _, err := conn.HeadBucket(&s3.HeadBucketInput{ 104 Bucket: aws.String(rs.Primary.ID), 105 }) 106 107 if err != nil { 108 return fmt.Errorf("S3Bucket error: %v", err) 109 } 110 return nil 111 } 112 } 113 114 func testAccCheckAWSS3BucketWebsite(n string, indexDoc string, errorDoc string) resource.TestCheckFunc { 115 return func(s *terraform.State) error { 116 rs, _ := s.RootModule().Resources[n] 117 conn := testAccProvider.Meta().(*AWSClient).s3conn 118 119 out, err := conn.GetBucketWebsite(&s3.GetBucketWebsiteInput{ 120 Bucket: aws.String(rs.Primary.ID), 121 }) 122 123 if err != nil { 124 if indexDoc == "" { 125 // If we want to assert that the website is not there, than 126 // this error is expected 127 return nil 128 } else { 129 return fmt.Errorf("S3BucketWebsite error: %v", err) 130 } 131 } 132 133 if *out.IndexDocument.Suffix != indexDoc { 134 if out.IndexDocument.Suffix != nil { 135 return fmt.Errorf("bad index document suffix: %s", *out.IndexDocument.Suffix) 136 } 137 return fmt.Errorf("bad index document suffix, is nil") 138 } 139 140 if v := out.ErrorDocument; v == nil { 141 if errorDoc != "" { 142 return fmt.Errorf("bad error doc, found nil, expected: %s", errorDoc) 143 } 144 } else { 145 if *v.Key != errorDoc { 146 return fmt.Errorf("bad error doc, expected: %s, got %#v", errorDoc, out.ErrorDocument) 147 } 148 } 149 150 return nil 151 } 152 } 153 154 // These need a bit of randomness as the name can only be used once globally 155 // within AWS 156 var randInt = rand.New(rand.NewSource(time.Now().UnixNano())).Int() 157 var testAccWebsiteEndpoint = fmt.Sprintf("tf-test-bucket-%d.s3-website-us-west-2.amazonaws.com", randInt) 158 var testAccAWSS3BucketConfig = fmt.Sprintf(` 159 resource "aws_s3_bucket" "bucket" { 160 bucket = "tf-test-bucket-%d" 161 acl = "public-read" 162 } 163 `, randInt) 164 165 var testAccAWSS3BucketWebsiteConfig = fmt.Sprintf(` 166 resource "aws_s3_bucket" "bucket" { 167 bucket = "tf-test-bucket-%d" 168 acl = "public-read" 169 170 website { 171 index_document = "index.html" 172 } 173 } 174 `, randInt) 175 176 var testAccAWSS3BucketWebsiteConfigWithError = fmt.Sprintf(` 177 resource "aws_s3_bucket" "bucket" { 178 bucket = "tf-test-bucket-%d" 179 acl = "public-read" 180 181 website { 182 index_document = "index.html" 183 error_document = "error.html" 184 } 185 } 186 `, randInt)