github.com/subuk/terraform@v0.6.14-0.20160317140351-de1567c2e732/builtin/providers/aws/validators_test.go (about) 1 package aws 2 3 import ( 4 "strings" 5 "testing" 6 ) 7 8 func TestValidateEcrRepositoryName(t *testing.T) { 9 validNames := []string{ 10 "nginx-web-app", 11 "project-a/nginx-web-app", 12 "domain.ltd/nginx-web-app", 13 "3chosome-thing.com/01different-pattern", 14 "0123456789/999999999", 15 "double/forward/slash", 16 "000000000000000", 17 } 18 for _, v := range validNames { 19 _, errors := validateEcrRepositoryName(v, "name") 20 if len(errors) != 0 { 21 t.Fatalf("%q should be a valid ECR repository name: %q", v, errors) 22 } 23 } 24 25 invalidNames := []string{ 26 // length > 256 27 "3cho_some-thing.com/01different.-_pattern01different.-_pattern01diff" + 28 "erent.-_pattern01different.-_pattern01different.-_pattern01different" + 29 ".-_pattern01different.-_pattern01different.-_pattern01different.-_pa" + 30 "ttern01different.-_pattern01different.-_pattern234567", 31 // length < 2 32 "i", 33 "special@character", 34 "different+special=character", 35 "double//slash", 36 "double..dot", 37 "/slash-at-the-beginning", 38 "slash-at-the-end/", 39 } 40 for _, v := range invalidNames { 41 _, errors := validateEcrRepositoryName(v, "name") 42 if len(errors) == 0 { 43 t.Fatalf("%q should be an invalid ECR repository name", v) 44 } 45 } 46 } 47 48 func TestValidateCloudWatchEventRuleName(t *testing.T) { 49 validNames := []string{ 50 "HelloWorl_d", 51 "hello-world", 52 "hello.World0125", 53 } 54 for _, v := range validNames { 55 _, errors := validateCloudWatchEventRuleName(v, "name") 56 if len(errors) != 0 { 57 t.Fatalf("%q should be a valid CW event rule name: %q", v, errors) 58 } 59 } 60 61 invalidNames := []string{ 62 "special@character", 63 "slash/in-the-middle", 64 // Length > 64 65 "TooLooooooooooooooooooooooooooooooooooooooooooooooooooooooongName", 66 } 67 for _, v := range invalidNames { 68 _, errors := validateCloudWatchEventRuleName(v, "name") 69 if len(errors) == 0 { 70 t.Fatalf("%q should be an invalid CW event rule name", v) 71 } 72 } 73 } 74 75 func TestValidateLambdaFunctionName(t *testing.T) { 76 validNames := []string{ 77 "arn:aws:lambda:us-west-2:123456789012:function:ThumbNail", 78 "FunctionName", 79 "function-name", 80 } 81 for _, v := range validNames { 82 _, errors := validateLambdaFunctionName(v, "name") 83 if len(errors) != 0 { 84 t.Fatalf("%q should be a valid Lambda function name: %q", v, errors) 85 } 86 } 87 88 invalidNames := []string{ 89 "/FunctionNameWithSlash", 90 "function.name.with.dots", 91 // lenght > 140 92 "arn:aws:lambda:us-west-2:123456789012:function:TooLoooooo" + 93 "ooooooooooooooooooooooooooooooooooooooooooooooooooooooo" + 94 "ooooooooooooooooongFunctionName", 95 } 96 for _, v := range invalidNames { 97 _, errors := validateLambdaFunctionName(v, "name") 98 if len(errors) == 0 { 99 t.Fatalf("%q should be an invalid Lambda function name", v) 100 } 101 } 102 } 103 104 func TestValidateLambdaQualifier(t *testing.T) { 105 validNames := []string{ 106 "123", 107 "prod", 108 "PROD", 109 "MyTestEnv", 110 "$LATEST", 111 } 112 for _, v := range validNames { 113 _, errors := validateLambdaQualifier(v, "name") 114 if len(errors) != 0 { 115 t.Fatalf("%q should be a valid Lambda function qualifier: %q", v, errors) 116 } 117 } 118 119 invalidNames := []string{ 120 // No ARNs allowed 121 "arn:aws:lambda:us-west-2:123456789012:function:prod", 122 // lenght > 128 123 "TooLooooooooooooooooooooooooooooooooooooooooooooooooooo" + 124 "ooooooooooooooooooooooooooooooooooooooooooooooooooo" + 125 "oooooooooooongQualifier", 126 } 127 for _, v := range invalidNames { 128 _, errors := validateLambdaQualifier(v, "name") 129 if len(errors) == 0 { 130 t.Fatalf("%q should be an invalid Lambda function qualifier", v) 131 } 132 } 133 } 134 135 func TestValidateLambdaPermissionAction(t *testing.T) { 136 validNames := []string{ 137 "lambda:*", 138 "lambda:InvokeFunction", 139 "*", 140 } 141 for _, v := range validNames { 142 _, errors := validateLambdaPermissionAction(v, "action") 143 if len(errors) != 0 { 144 t.Fatalf("%q should be a valid Lambda permission action: %q", v, errors) 145 } 146 } 147 148 invalidNames := []string{ 149 "yada", 150 "lambda:123", 151 "*:*", 152 "lambda:Invoke*", 153 } 154 for _, v := range invalidNames { 155 _, errors := validateLambdaPermissionAction(v, "action") 156 if len(errors) == 0 { 157 t.Fatalf("%q should be an invalid Lambda permission action", v) 158 } 159 } 160 } 161 162 func TestValidateAwsAccountId(t *testing.T) { 163 validNames := []string{ 164 "123456789012", 165 "999999999999", 166 } 167 for _, v := range validNames { 168 _, errors := validateAwsAccountId(v, "account_id") 169 if len(errors) != 0 { 170 t.Fatalf("%q should be a valid AWS Account ID: %q", v, errors) 171 } 172 } 173 174 invalidNames := []string{ 175 "12345678901", // too short 176 "1234567890123", // too long 177 "invalid", 178 "x123456789012", 179 } 180 for _, v := range invalidNames { 181 _, errors := validateAwsAccountId(v, "account_id") 182 if len(errors) == 0 { 183 t.Fatalf("%q should be an invalid AWS Account ID", v) 184 } 185 } 186 } 187 188 func TestValidateArn(t *testing.T) { 189 validNames := []string{ 190 "arn:aws:elasticbeanstalk:us-east-1:123456789012:environment/My App/MyEnvironment", // Beanstalk 191 "arn:aws:iam::123456789012:user/David", // IAM User 192 "arn:aws:rds:eu-west-1:123456789012:db:mysql-db", // RDS 193 "arn:aws:s3:::my_corporate_bucket/exampleobject.png", // S3 object 194 "arn:aws:events:us-east-1:319201112229:rule/rule_name", // CloudWatch Rule 195 "arn:aws:lambda:eu-west-1:319201112229:function:myCustomFunction", // Lambda function 196 "arn:aws:lambda:eu-west-1:319201112229:function:myCustomFunction:Qualifier", // Lambda func qualifier 197 } 198 for _, v := range validNames { 199 _, errors := validateArn(v, "arn") 200 if len(errors) != 0 { 201 t.Fatalf("%q should be a valid ARN: %q", v, errors) 202 } 203 } 204 205 invalidNames := []string{ 206 "arn", 207 "123456789012", 208 "arn:aws", 209 "arn:aws:logs", 210 "arn:aws:logs:region:*:*", 211 } 212 for _, v := range invalidNames { 213 _, errors := validateArn(v, "arn") 214 if len(errors) == 0 { 215 t.Fatalf("%q should be an invalid ARN", v) 216 } 217 } 218 } 219 220 func TestValidatePolicyStatementId(t *testing.T) { 221 validNames := []string{ 222 "YadaHereAndThere", 223 "Valid-5tatement_Id", 224 "1234", 225 } 226 for _, v := range validNames { 227 _, errors := validatePolicyStatementId(v, "statement_id") 228 if len(errors) != 0 { 229 t.Fatalf("%q should be a valid Statement ID: %q", v, errors) 230 } 231 } 232 233 invalidNames := []string{ 234 "Invalid/StatementId/with/slashes", 235 "InvalidStatementId.with.dots", 236 // length > 100 237 "TooooLoooooooooooooooooooooooooooooooooooooooooooo" + 238 "ooooooooooooooooooooooooooooooooooooooooStatementId", 239 } 240 for _, v := range invalidNames { 241 _, errors := validatePolicyStatementId(v, "statement_id") 242 if len(errors) == 0 { 243 t.Fatalf("%q should be an invalid Statement ID", v) 244 } 245 } 246 } 247 248 func TestValidateCIDRNetworkAddress(t *testing.T) { 249 cases := []struct { 250 CIDR string 251 ExpectedErrSubstr string 252 }{ 253 {"notacidr", `must contain a valid CIDR`}, 254 {"10.0.1.0/16", `must contain a valid network CIDR`}, 255 {"10.0.1.0/24", ``}, 256 } 257 258 for i, tc := range cases { 259 _, errs := validateCIDRNetworkAddress(tc.CIDR, "foo") 260 if tc.ExpectedErrSubstr == "" { 261 if len(errs) != 0 { 262 t.Fatalf("%d/%d: Expected no error, got errs: %#v", 263 i+1, len(cases), errs) 264 } 265 } else { 266 if len(errs) != 1 { 267 t.Fatalf("%d/%d: Expected 1 err containing %q, got %d errs", 268 i+1, len(cases), tc.ExpectedErrSubstr, len(errs)) 269 } 270 if !strings.Contains(errs[0].Error(), tc.ExpectedErrSubstr) { 271 t.Fatalf("%d/%d: Expected err: %q, to include %q", 272 i+1, len(cases), errs[0], tc.ExpectedErrSubstr) 273 } 274 } 275 } 276 } 277 278 func TestValidateHTTPMethod(t *testing.T) { 279 validCases := []string{"GET", "PUT", "POST", "DELETE", "OPTIONS", "HEAD", "PATCH"} 280 for i, method := range validCases { 281 _, errs := validateHTTPMethod(method, "foo") 282 if len(errs) != 0 { 283 t.Fatalf("%d/%d: Expected no error, got errs: %#v", 284 i+1, len(validCases), errs) 285 } 286 } 287 }