github.com/jrperritt/terraform@v0.1.1-0.20170525065507-96f391dafc38/builtin/providers/aws/resource_aws_wafregional_byte_match_set_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/hashicorp/terraform/helper/resource"
     8  	"github.com/hashicorp/terraform/terraform"
     9  
    10  	"github.com/aws/aws-sdk-go/aws"
    11  	"github.com/aws/aws-sdk-go/aws/awserr"
    12  	"github.com/aws/aws-sdk-go/service/waf"
    13  	"github.com/hashicorp/errwrap"
    14  	"github.com/hashicorp/terraform/helper/acctest"
    15  )
    16  
    17  func TestAccAWSWafRegionalByteMatchSet_basic(t *testing.T) {
    18  	var v waf.ByteMatchSet
    19  	byteMatchSet := fmt.Sprintf("byteMatchSet-%s", acctest.RandString(5))
    20  
    21  	resource.Test(t, resource.TestCase{
    22  		PreCheck:     func() { testAccPreCheck(t) },
    23  		Providers:    testAccProviders,
    24  		CheckDestroy: testAccCheckAWSWafRegionalByteMatchSetDestroy,
    25  		Steps: []resource.TestStep{
    26  			resource.TestStep{
    27  				Config: testAccAWSWafRegionalByteMatchSetConfig(byteMatchSet),
    28  				Check: resource.ComposeTestCheckFunc(
    29  					testAccCheckAWSWafRegionalByteMatchSetExists("aws_wafregional_byte_match_set.byte_set", &v),
    30  					resource.TestCheckResourceAttr(
    31  						"aws_wafregional_byte_match_set.byte_set", "name", byteMatchSet),
    32  					resource.TestCheckResourceAttr(
    33  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.#", "2"),
    34  					resource.TestCheckResourceAttr(
    35  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.field_to_match.2991901334.data", "referer"),
    36  					resource.TestCheckResourceAttr(
    37  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.field_to_match.2991901334.type", "HEADER"),
    38  					resource.TestCheckResourceAttr(
    39  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.positional_constraint", "CONTAINS"),
    40  					resource.TestCheckResourceAttr(
    41  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.target_string", "badrefer1"),
    42  					resource.TestCheckResourceAttr(
    43  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.text_transformation", "NONE"),
    44  					resource.TestCheckResourceAttr(
    45  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.field_to_match.2991901334.data", "referer"),
    46  					resource.TestCheckResourceAttr(
    47  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.field_to_match.2991901334.type", "HEADER"),
    48  					resource.TestCheckResourceAttr(
    49  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.positional_constraint", "CONTAINS"),
    50  					resource.TestCheckResourceAttr(
    51  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.target_string", "badrefer2"),
    52  					resource.TestCheckResourceAttr(
    53  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.text_transformation", "NONE"),
    54  				),
    55  			},
    56  		},
    57  	})
    58  }
    59  
    60  func TestAccAWSWafRegionalByteMatchSet_changeNameForceNew(t *testing.T) {
    61  	var before, after waf.ByteMatchSet
    62  	byteMatchSet := fmt.Sprintf("byteMatchSet-%s", acctest.RandString(5))
    63  	byteMatchSetNewName := fmt.Sprintf("byteMatchSet-%s", acctest.RandString(5))
    64  
    65  	resource.Test(t, resource.TestCase{
    66  		PreCheck:     func() { testAccPreCheck(t) },
    67  		Providers:    testAccProviders,
    68  		CheckDestroy: testAccCheckAWSWafRegionalByteMatchSetDestroy,
    69  		Steps: []resource.TestStep{
    70  			{
    71  				Config: testAccAWSWafRegionalByteMatchSetConfig(byteMatchSet),
    72  				Check: resource.ComposeTestCheckFunc(
    73  					testAccCheckAWSWafRegionalByteMatchSetExists("aws_wafregional_byte_match_set.byte_set", &before),
    74  					resource.TestCheckResourceAttr(
    75  						"aws_wafregional_byte_match_set.byte_set", "name", byteMatchSet),
    76  					resource.TestCheckResourceAttr(
    77  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.#", "2"),
    78  					resource.TestCheckResourceAttr(
    79  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.field_to_match.2991901334.data", "referer"),
    80  					resource.TestCheckResourceAttr(
    81  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.field_to_match.2991901334.type", "HEADER"),
    82  					resource.TestCheckResourceAttr(
    83  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.positional_constraint", "CONTAINS"),
    84  					resource.TestCheckResourceAttr(
    85  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.target_string", "badrefer1"),
    86  					resource.TestCheckResourceAttr(
    87  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.text_transformation", "NONE"),
    88  					resource.TestCheckResourceAttr(
    89  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.field_to_match.2991901334.data", "referer"),
    90  					resource.TestCheckResourceAttr(
    91  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.field_to_match.2991901334.type", "HEADER"),
    92  					resource.TestCheckResourceAttr(
    93  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.positional_constraint", "CONTAINS"),
    94  					resource.TestCheckResourceAttr(
    95  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.target_string", "badrefer2"),
    96  					resource.TestCheckResourceAttr(
    97  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.text_transformation", "NONE"),
    98  				),
    99  			},
   100  			{
   101  				Config: testAccAWSWafRegionalByteMatchSetConfigChangeName(byteMatchSetNewName),
   102  				Check: resource.ComposeTestCheckFunc(
   103  					testAccCheckAWSWafRegionalByteMatchSetExists("aws_wafregional_byte_match_set.byte_set", &after),
   104  					resource.TestCheckResourceAttr(
   105  						"aws_wafregional_byte_match_set.byte_set", "name", byteMatchSetNewName),
   106  					resource.TestCheckResourceAttr(
   107  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.#", "2"),
   108  					resource.TestCheckResourceAttr(
   109  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.field_to_match.2991901334.data", "referer"),
   110  					resource.TestCheckResourceAttr(
   111  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.field_to_match.2991901334.type", "HEADER"),
   112  					resource.TestCheckResourceAttr(
   113  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.positional_constraint", "CONTAINS"),
   114  					resource.TestCheckResourceAttr(
   115  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.target_string", "badrefer1"),
   116  					resource.TestCheckResourceAttr(
   117  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.text_transformation", "NONE"),
   118  					resource.TestCheckResourceAttr(
   119  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.field_to_match.2991901334.data", "referer"),
   120  					resource.TestCheckResourceAttr(
   121  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.field_to_match.2991901334.type", "HEADER"),
   122  					resource.TestCheckResourceAttr(
   123  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.positional_constraint", "CONTAINS"),
   124  					resource.TestCheckResourceAttr(
   125  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.target_string", "badrefer2"),
   126  					resource.TestCheckResourceAttr(
   127  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.text_transformation", "NONE"),
   128  				),
   129  			},
   130  		},
   131  	})
   132  }
   133  
   134  func TestAccAWSWafRegionalByteMatchSet_changeByteMatchTuple(t *testing.T) {
   135  	var before, after waf.ByteMatchSet
   136  	byteMatchSetName := fmt.Sprintf("byte-batch-set-%s", acctest.RandString(5))
   137  
   138  	resource.Test(t, resource.TestCase{
   139  		PreCheck:     func() { testAccPreCheck(t) },
   140  		Providers:    testAccProviders,
   141  		CheckDestroy: testAccCheckAWSWafRegionalByteMatchSetDestroy,
   142  		Steps: []resource.TestStep{
   143  			{
   144  				Config: testAccAWSWafRegionalByteMatchSetConfig(byteMatchSetName),
   145  				Check: resource.ComposeTestCheckFunc(
   146  					testAccCheckAWSWafRegionalByteMatchSetExists("aws_wafregional_byte_match_set.byte_set", &before),
   147  					resource.TestCheckResourceAttr(
   148  						"aws_wafregional_byte_match_set.byte_set", "name", byteMatchSetName),
   149  					resource.TestCheckResourceAttr(
   150  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.#", "2"),
   151  					resource.TestCheckResourceAttr(
   152  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.field_to_match.2991901334.data", "referer"),
   153  					resource.TestCheckResourceAttr(
   154  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.field_to_match.2991901334.type", "HEADER"),
   155  					resource.TestCheckResourceAttr(
   156  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.positional_constraint", "CONTAINS"),
   157  					resource.TestCheckResourceAttr(
   158  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.target_string", "badrefer1"),
   159  					resource.TestCheckResourceAttr(
   160  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2174619346.text_transformation", "NONE"),
   161  					resource.TestCheckResourceAttr(
   162  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.field_to_match.2991901334.data", "referer"),
   163  					resource.TestCheckResourceAttr(
   164  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.field_to_match.2991901334.type", "HEADER"),
   165  					resource.TestCheckResourceAttr(
   166  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.positional_constraint", "CONTAINS"),
   167  					resource.TestCheckResourceAttr(
   168  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.target_string", "badrefer2"),
   169  					resource.TestCheckResourceAttr(
   170  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.839525137.text_transformation", "NONE"),
   171  				),
   172  			},
   173  			{
   174  				Config: testAccAWSWafRegionalByteMatchSetConfigChangeByteMatchTuple(byteMatchSetName),
   175  				Check: resource.ComposeTestCheckFunc(
   176  					testAccCheckAWSWafRegionalByteMatchSetExists("aws_wafregional_byte_match_set.byte_set", &after),
   177  					resource.TestCheckResourceAttr(
   178  						"aws_wafregional_byte_match_set.byte_set", "name", byteMatchSetName),
   179  					resource.TestCheckResourceAttr(
   180  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.#", "2"),
   181  					resource.TestCheckResourceAttr(
   182  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2397850647.field_to_match.4253810390.data", "GET"),
   183  					resource.TestCheckResourceAttr(
   184  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2397850647.field_to_match.4253810390.type", "METHOD"),
   185  					resource.TestCheckResourceAttr(
   186  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2397850647.positional_constraint", "STARTS_WITH"),
   187  					resource.TestCheckResourceAttr(
   188  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2397850647.target_string", "badrefer1+"),
   189  					resource.TestCheckResourceAttr(
   190  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.2397850647.text_transformation", "LOWERCASE"),
   191  					resource.TestCheckResourceAttr(
   192  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.4153613423.field_to_match.3756326843.data", ""),
   193  					resource.TestCheckResourceAttr(
   194  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.4153613423.field_to_match.3756326843.type", "URI"),
   195  					resource.TestCheckResourceAttr(
   196  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.4153613423.positional_constraint", "ENDS_WITH"),
   197  					resource.TestCheckResourceAttr(
   198  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.4153613423.target_string", "badrefer2+"),
   199  					resource.TestCheckResourceAttr(
   200  						"aws_wafregional_byte_match_set.byte_set", "byte_match_tuple.4153613423.text_transformation", "LOWERCASE"),
   201  				),
   202  			},
   203  		},
   204  	})
   205  }
   206  
   207  func TestAccAWSWafRegionalByteMatchSet_noByteMatchTuples(t *testing.T) {
   208  	var byteMatchSet waf.ByteMatchSet
   209  	byteMatchSetName := fmt.Sprintf("byte-batch-set-%s", acctest.RandString(5))
   210  
   211  	resource.Test(t, resource.TestCase{
   212  		PreCheck:     func() { testAccPreCheck(t) },
   213  		Providers:    testAccProviders,
   214  		CheckDestroy: testAccCheckAWSWafRegionalByteMatchSetDestroy,
   215  		Steps: []resource.TestStep{
   216  			{
   217  				Config: testAccAWSWafRegionalByteMatchSetConfig_noDescriptors(byteMatchSetName),
   218  				Check: resource.ComposeAggregateTestCheckFunc(
   219  					testAccCheckAWSWafRegionalByteMatchSetExists("aws_wafregional_byte_match_set.byte_match_set", &byteMatchSet),
   220  					resource.TestCheckResourceAttr("aws_wafregional_byte_match_set.byte_match_set", "name", byteMatchSetName),
   221  					resource.TestCheckResourceAttr("aws_wafregional_byte_match_set.byte_match_set", "byte_match_tuple.#", "0"),
   222  				),
   223  			},
   224  		},
   225  	})
   226  }
   227  
   228  func TestAccAWSWafRegionalByteMatchSet_disappears(t *testing.T) {
   229  	var v waf.ByteMatchSet
   230  	byteMatchSet := fmt.Sprintf("byteMatchSet-%s", acctest.RandString(5))
   231  
   232  	resource.Test(t, resource.TestCase{
   233  		PreCheck:     func() { testAccPreCheck(t) },
   234  		Providers:    testAccProviders,
   235  		CheckDestroy: testAccCheckAWSWafRegionalByteMatchSetDestroy,
   236  		Steps: []resource.TestStep{
   237  			{
   238  				Config: testAccAWSWafRegionalByteMatchSetConfig(byteMatchSet),
   239  				Check: resource.ComposeTestCheckFunc(
   240  					testAccCheckAWSWafRegionalByteMatchSetExists("aws_wafregional_byte_match_set.byte_set", &v),
   241  					testAccCheckAWSWafRegionalByteMatchSetDisappears(&v),
   242  				),
   243  				ExpectNonEmptyPlan: true,
   244  			},
   245  		},
   246  	})
   247  }
   248  
   249  func testAccCheckAWSWafRegionalByteMatchSetDisappears(v *waf.ByteMatchSet) resource.TestCheckFunc {
   250  	return func(s *terraform.State) error {
   251  		conn := testAccProvider.Meta().(*AWSClient).wafregionalconn
   252  		region := testAccProvider.Meta().(*AWSClient).region
   253  
   254  		wr := newWafRegionalRetryer(conn, region)
   255  		_, err := wr.RetryWithToken(func(token *string) (interface{}, error) {
   256  			req := &waf.UpdateByteMatchSetInput{
   257  				ChangeToken:    token,
   258  				ByteMatchSetId: v.ByteMatchSetId,
   259  			}
   260  
   261  			for _, ByteMatchTuple := range v.ByteMatchTuples {
   262  				ByteMatchUpdate := &waf.ByteMatchSetUpdate{
   263  					Action: aws.String("DELETE"),
   264  					ByteMatchTuple: &waf.ByteMatchTuple{
   265  						FieldToMatch:         ByteMatchTuple.FieldToMatch,
   266  						PositionalConstraint: ByteMatchTuple.PositionalConstraint,
   267  						TargetString:         ByteMatchTuple.TargetString,
   268  						TextTransformation:   ByteMatchTuple.TextTransformation,
   269  					},
   270  				}
   271  				req.Updates = append(req.Updates, ByteMatchUpdate)
   272  			}
   273  
   274  			return conn.UpdateByteMatchSet(req)
   275  		})
   276  		if err != nil {
   277  			return errwrap.Wrapf("[ERROR] Error updating ByteMatchSet: {{err}}", err)
   278  		}
   279  
   280  		_, err = wr.RetryWithToken(func(token *string) (interface{}, error) {
   281  			opts := &waf.DeleteByteMatchSetInput{
   282  				ChangeToken:    token,
   283  				ByteMatchSetId: v.ByteMatchSetId,
   284  			}
   285  			return conn.DeleteByteMatchSet(opts)
   286  		})
   287  		if err != nil {
   288  			return errwrap.Wrapf("[ERROR] Error deleting ByteMatchSet: {{err}}", err)
   289  		}
   290  
   291  		return nil
   292  	}
   293  }
   294  
   295  func testAccCheckAWSWafRegionalByteMatchSetExists(n string, v *waf.ByteMatchSet) resource.TestCheckFunc {
   296  	return func(s *terraform.State) error {
   297  		rs, ok := s.RootModule().Resources[n]
   298  		if !ok {
   299  			return fmt.Errorf("Not found: %s", n)
   300  		}
   301  
   302  		if rs.Primary.ID == "" {
   303  			return fmt.Errorf("No WAF ByteMatchSet ID is set")
   304  		}
   305  
   306  		conn := testAccProvider.Meta().(*AWSClient).wafregionalconn
   307  		resp, err := conn.GetByteMatchSet(&waf.GetByteMatchSetInput{
   308  			ByteMatchSetId: aws.String(rs.Primary.ID),
   309  		})
   310  
   311  		if err != nil {
   312  			return err
   313  		}
   314  
   315  		if *resp.ByteMatchSet.ByteMatchSetId == rs.Primary.ID {
   316  			*v = *resp.ByteMatchSet
   317  			return nil
   318  		}
   319  
   320  		return fmt.Errorf("WAF ByteMatchSet (%s) not found", rs.Primary.ID)
   321  	}
   322  }
   323  
   324  func testAccCheckAWSWafRegionalByteMatchSetDestroy(s *terraform.State) error {
   325  	for _, rs := range s.RootModule().Resources {
   326  		if rs.Type != "aws_wafregional_byte_match_set" {
   327  			continue
   328  		}
   329  
   330  		conn := testAccProvider.Meta().(*AWSClient).wafregionalconn
   331  		resp, err := conn.GetByteMatchSet(
   332  			&waf.GetByteMatchSetInput{
   333  				ByteMatchSetId: aws.String(rs.Primary.ID),
   334  			})
   335  
   336  		if err == nil {
   337  			if *resp.ByteMatchSet.ByteMatchSetId == rs.Primary.ID {
   338  				return fmt.Errorf("WAF ByteMatchSet %s still exists", rs.Primary.ID)
   339  			}
   340  		}
   341  
   342  		// Return nil if the ByteMatchSet is already destroyed
   343  		if awsErr, ok := err.(awserr.Error); ok {
   344  			if awsErr.Code() == "WAFNonexistentItemException" {
   345  				return nil
   346  			}
   347  		}
   348  
   349  		return err
   350  	}
   351  
   352  	return nil
   353  }
   354  
   355  func testAccAWSWafRegionalByteMatchSetConfig(name string) string {
   356  	return fmt.Sprintf(`
   357  resource "aws_wafregional_byte_match_set" "byte_set" {
   358    name = "%s"
   359    byte_match_tuple {
   360      text_transformation = "NONE"
   361      target_string = "badrefer1"
   362      positional_constraint = "CONTAINS"
   363      field_to_match {
   364        type = "HEADER"
   365        data = "referer"
   366      }
   367    }
   368  
   369    byte_match_tuple {
   370      text_transformation = "NONE"
   371      target_string = "badrefer2"
   372      positional_constraint = "CONTAINS"
   373      field_to_match {
   374        type = "HEADER"
   375        data = "referer"
   376      }
   377    }
   378  }`, name)
   379  }
   380  
   381  func testAccAWSWafRegionalByteMatchSetConfigChangeName(name string) string {
   382  	return fmt.Sprintf(`
   383  resource "aws_wafregional_byte_match_set" "byte_set" {
   384    name = "%s"
   385    byte_match_tuple {
   386      text_transformation = "NONE"
   387      target_string = "badrefer1"
   388      positional_constraint = "CONTAINS"
   389      field_to_match {
   390        type = "HEADER"
   391        data = "referer"
   392      }
   393    }
   394  
   395    byte_match_tuple {
   396      text_transformation = "NONE"
   397      target_string = "badrefer2"
   398      positional_constraint = "CONTAINS"
   399      field_to_match {
   400        type = "HEADER"
   401        data = "referer"
   402      }
   403    }
   404  }`, name)
   405  }
   406  
   407  func testAccAWSWafRegionalByteMatchSetConfig_noDescriptors(name string) string {
   408  	return fmt.Sprintf(`
   409  resource "aws_wafregional_byte_match_set" "byte_match_set" {
   410  	name = "%s"
   411  }`, name)
   412  }
   413  
   414  func testAccAWSWafRegionalByteMatchSetConfigChangeByteMatchTuple(name string) string {
   415  	return fmt.Sprintf(`
   416  resource "aws_wafregional_byte_match_set" "byte_set" {
   417    name = "%s"
   418    byte_match_tuple {
   419      text_transformation = "LOWERCASE"
   420      target_string = "badrefer1+"
   421      positional_constraint = "STARTS_WITH"
   422      field_to_match {
   423        type = "METHOD"
   424        data = "GET"
   425      }
   426    }
   427  
   428    byte_match_tuple {
   429      text_transformation = "LOWERCASE"
   430      target_string = "badrefer2+"
   431      positional_constraint = "ENDS_WITH"
   432      field_to_match {
   433        type = "URI"
   434      }
   435    }
   436  }`, name)
   437  }