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)