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 }