github.com/hobbeswalsh/terraform@v0.3.7-0.20150619183303-ad17cf55a0fa/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 "strconv" 9 "testing" 10 "time" 11 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/service/s3" 17 ) 18 19 func TestAccAWSS3Bucket_basic(t *testing.T) { 20 resource.Test(t, resource.TestCase{ 21 PreCheck: func() { testAccPreCheck(t) }, 22 Providers: testAccProviders, 23 CheckDestroy: testAccCheckAWSS3BucketDestroy, 24 Steps: []resource.TestStep{ 25 resource.TestStep{ 26 Config: testAccAWSS3BucketConfig, 27 Check: resource.ComposeTestCheckFunc( 28 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 29 resource.TestCheckResourceAttr( 30 "aws_s3_bucket.bucket", "hosted_zone_id", HostedZoneIDForRegion("us-west-2")), 31 resource.TestCheckResourceAttr( 32 "aws_s3_bucket.bucket", "region", "us-west-2"), 33 resource.TestCheckResourceAttr( 34 "aws_s3_bucket.bucket", "website_endpoint", ""), 35 ), 36 }, 37 }, 38 }) 39 } 40 41 func TestAccAWSS3Bucket_Policy(t *testing.T) { 42 resource.Test(t, resource.TestCase{ 43 PreCheck: func() { testAccPreCheck(t) }, 44 Providers: testAccProviders, 45 CheckDestroy: testAccCheckAWSS3BucketDestroy, 46 Steps: []resource.TestStep{ 47 resource.TestStep{ 48 Config: testAccAWSS3BucketConfigWithPolicy, 49 Check: resource.ComposeTestCheckFunc( 50 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 51 testAccCheckAWSS3BucketPolicy( 52 "aws_s3_bucket.bucket", testAccAWSS3BucketPolicy), 53 ), 54 }, 55 resource.TestStep{ 56 Config: testAccAWSS3BucketConfig, 57 Check: resource.ComposeTestCheckFunc( 58 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 59 testAccCheckAWSS3BucketPolicy( 60 "aws_s3_bucket.bucket", ""), 61 ), 62 }, 63 }, 64 }) 65 } 66 67 func TestAccAWSS3Bucket_Website(t *testing.T) { 68 resource.Test(t, resource.TestCase{ 69 PreCheck: func() { testAccPreCheck(t) }, 70 Providers: testAccProviders, 71 CheckDestroy: testAccCheckAWSS3BucketDestroy, 72 Steps: []resource.TestStep{ 73 resource.TestStep{ 74 Config: testAccAWSS3BucketWebsiteConfig, 75 Check: resource.ComposeTestCheckFunc( 76 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 77 testAccCheckAWSS3BucketWebsite( 78 "aws_s3_bucket.bucket", "index.html", "", ""), 79 resource.TestCheckResourceAttr( 80 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint), 81 ), 82 }, 83 resource.TestStep{ 84 Config: testAccAWSS3BucketWebsiteConfigWithError, 85 Check: resource.ComposeTestCheckFunc( 86 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 87 testAccCheckAWSS3BucketWebsite( 88 "aws_s3_bucket.bucket", "index.html", "error.html", ""), 89 resource.TestCheckResourceAttr( 90 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint), 91 ), 92 }, 93 resource.TestStep{ 94 Config: testAccAWSS3BucketConfig, 95 Check: resource.ComposeTestCheckFunc( 96 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 97 testAccCheckAWSS3BucketWebsite( 98 "aws_s3_bucket.bucket", "", "", ""), 99 resource.TestCheckResourceAttr( 100 "aws_s3_bucket.bucket", "website_endpoint", ""), 101 ), 102 }, 103 }, 104 }) 105 } 106 107 func TestAccAWSS3Bucket_WebsiteRedirect(t *testing.T) { 108 resource.Test(t, resource.TestCase{ 109 PreCheck: func() { testAccPreCheck(t) }, 110 Providers: testAccProviders, 111 CheckDestroy: testAccCheckAWSS3BucketDestroy, 112 Steps: []resource.TestStep{ 113 resource.TestStep{ 114 Config: testAccAWSS3BucketWebsiteConfigWithRedirect, 115 Check: resource.ComposeTestCheckFunc( 116 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 117 testAccCheckAWSS3BucketWebsite( 118 "aws_s3_bucket.bucket", "", "", "hashicorp.com"), 119 resource.TestCheckResourceAttr( 120 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint), 121 ), 122 }, 123 resource.TestStep{ 124 Config: testAccAWSS3BucketConfig, 125 Check: resource.ComposeTestCheckFunc( 126 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 127 testAccCheckAWSS3BucketWebsite( 128 "aws_s3_bucket.bucket", "", "", ""), 129 resource.TestCheckResourceAttr( 130 "aws_s3_bucket.bucket", "website_endpoint", ""), 131 ), 132 }, 133 }, 134 }) 135 } 136 137 func testAccCheckAWSS3BucketDestroy(s *terraform.State) error { 138 conn := testAccProvider.Meta().(*AWSClient).s3conn 139 140 for _, rs := range s.RootModule().Resources { 141 if rs.Type != "aws_s3_bucket" { 142 continue 143 } 144 _, err := conn.DeleteBucket(&s3.DeleteBucketInput{ 145 Bucket: aws.String(rs.Primary.ID), 146 }) 147 if err != nil { 148 return err 149 } 150 } 151 return nil 152 } 153 154 func testAccCheckAWSS3BucketExists(n string) resource.TestCheckFunc { 155 return func(s *terraform.State) error { 156 rs, ok := s.RootModule().Resources[n] 157 if !ok { 158 return fmt.Errorf("Not found: %s", n) 159 } 160 161 if rs.Primary.ID == "" { 162 return fmt.Errorf("No S3 Bucket ID is set") 163 } 164 165 conn := testAccProvider.Meta().(*AWSClient).s3conn 166 _, err := conn.HeadBucket(&s3.HeadBucketInput{ 167 Bucket: aws.String(rs.Primary.ID), 168 }) 169 170 if err != nil { 171 return fmt.Errorf("S3Bucket error: %v", err) 172 } 173 return nil 174 } 175 } 176 177 func testAccCheckAWSS3BucketPolicy(n string, policy string) resource.TestCheckFunc { 178 return func(s *terraform.State) error { 179 rs, _ := s.RootModule().Resources[n] 180 conn := testAccProvider.Meta().(*AWSClient).s3conn 181 182 out, err := conn.GetBucketPolicy(&s3.GetBucketPolicyInput{ 183 Bucket: aws.String(rs.Primary.ID), 184 }) 185 186 if err != nil { 187 if policy == "" { 188 // expected 189 return nil 190 } else { 191 return fmt.Errorf("GetBucketPolicy error: %v, expected %s", err, policy) 192 } 193 } 194 195 if v := out.Policy; v == nil { 196 if policy != "" { 197 return fmt.Errorf("bad policy, found nil, expected: %s", policy) 198 } 199 } else { 200 expected := make(map[string]interface{}) 201 if err := json.Unmarshal([]byte(policy), &expected); err != nil { 202 return err 203 } 204 actual := make(map[string]interface{}) 205 if err := json.Unmarshal([]byte(*v), &actual); err != nil { 206 return err 207 } 208 209 if !reflect.DeepEqual(expected, actual) { 210 return fmt.Errorf("bad policy, expected: %#v, got %#v", expected, actual) 211 } 212 } 213 214 return nil 215 } 216 } 217 func testAccCheckAWSS3BucketWebsite(n string, indexDoc string, errorDoc string, redirectTo string) resource.TestCheckFunc { 218 return func(s *terraform.State) error { 219 rs, _ := s.RootModule().Resources[n] 220 conn := testAccProvider.Meta().(*AWSClient).s3conn 221 222 out, err := conn.GetBucketWebsite(&s3.GetBucketWebsiteInput{ 223 Bucket: aws.String(rs.Primary.ID), 224 }) 225 226 if err != nil { 227 if indexDoc == "" { 228 // If we want to assert that the website is not there, than 229 // this error is expected 230 return nil 231 } else { 232 return fmt.Errorf("S3BucketWebsite error: %v", err) 233 } 234 } 235 236 if v := out.IndexDocument; v == nil { 237 if indexDoc != "" { 238 return fmt.Errorf("bad index doc, found nil, expected: %s", indexDoc) 239 } 240 } else { 241 if *v.Suffix != indexDoc { 242 return fmt.Errorf("bad index doc, expected: %s, got %#v", indexDoc, out.IndexDocument) 243 } 244 } 245 246 if v := out.ErrorDocument; v == nil { 247 if errorDoc != "" { 248 return fmt.Errorf("bad error doc, found nil, expected: %s", errorDoc) 249 } 250 } else { 251 if *v.Key != errorDoc { 252 return fmt.Errorf("bad error doc, expected: %s, got %#v", errorDoc, out.ErrorDocument) 253 } 254 } 255 256 if v := out.RedirectAllRequestsTo; v == nil { 257 if redirectTo != "" { 258 return fmt.Errorf("bad redirect to, found nil, expected: %s", redirectTo) 259 } 260 } else { 261 if *v.HostName != redirectTo { 262 return fmt.Errorf("bad redirect to, expected: %s, got %#v", redirectTo, out.RedirectAllRequestsTo) 263 } 264 } 265 266 return nil 267 } 268 } 269 270 // These need a bit of randomness as the name can only be used once globally 271 // within AWS 272 var randInt = rand.New(rand.NewSource(time.Now().UnixNano())).Int() 273 var testAccWebsiteEndpoint = fmt.Sprintf("tf-test-bucket-%d.s3-website-us-west-2.amazonaws.com", randInt) 274 var testAccAWSS3BucketPolicy = fmt.Sprintf(`{ "Version": "2008-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::tf-test-bucket-%d/*" } ] }`, randInt) 275 276 var testAccAWSS3BucketConfig = fmt.Sprintf(` 277 resource "aws_s3_bucket" "bucket" { 278 bucket = "tf-test-bucket-%d" 279 acl = "public-read" 280 } 281 `, randInt) 282 283 var testAccAWSS3BucketWebsiteConfig = fmt.Sprintf(` 284 resource "aws_s3_bucket" "bucket" { 285 bucket = "tf-test-bucket-%d" 286 acl = "public-read" 287 288 website { 289 index_document = "index.html" 290 } 291 } 292 `, randInt) 293 294 var testAccAWSS3BucketWebsiteConfigWithError = fmt.Sprintf(` 295 resource "aws_s3_bucket" "bucket" { 296 bucket = "tf-test-bucket-%d" 297 acl = "public-read" 298 299 website { 300 index_document = "index.html" 301 error_document = "error.html" 302 } 303 } 304 `, randInt) 305 306 var testAccAWSS3BucketWebsiteConfigWithRedirect = fmt.Sprintf(` 307 resource "aws_s3_bucket" "bucket" { 308 bucket = "tf-test-bucket-%d" 309 acl = "public-read" 310 311 website { 312 redirect_all_requests_to = "hashicorp.com" 313 } 314 } 315 `, randInt) 316 317 var testAccAWSS3BucketConfigWithPolicy = fmt.Sprintf(` 318 resource "aws_s3_bucket" "bucket" { 319 bucket = "tf-test-bucket-%d" 320 acl = "public-read" 321 policy = %s 322 } 323 `, randInt, strconv.Quote(testAccAWSS3BucketPolicy))