github.com/graywolf-at-work-2/terraform-vendor@v1.4.5/internal/lang/funcs/encoding_test.go (about) 1 package funcs 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/hashicorp/terraform/internal/lang/marks" 8 "github.com/zclconf/go-cty/cty" 9 ) 10 11 func TestBase64Decode(t *testing.T) { 12 tests := []struct { 13 String cty.Value 14 Want cty.Value 15 Err bool 16 }{ 17 { 18 cty.StringVal("YWJjMTIzIT8kKiYoKSctPUB+"), 19 cty.StringVal("abc123!?$*&()'-=@~"), 20 false, 21 }, 22 { 23 cty.StringVal("YWJjMTIzIT8kKiYoKSctPUB+").Mark(marks.Sensitive), 24 cty.StringVal("abc123!?$*&()'-=@~").Mark(marks.Sensitive), 25 false, 26 }, 27 { // Invalid base64 data decoding 28 cty.StringVal("this-is-an-invalid-base64-data"), 29 cty.UnknownVal(cty.String), 30 true, 31 }, 32 { // Invalid utf-8 33 cty.StringVal("\xc3\x28"), 34 cty.UnknownVal(cty.String), 35 true, 36 }, 37 } 38 39 for _, test := range tests { 40 t.Run(fmt.Sprintf("base64decode(%#v)", test.String), func(t *testing.T) { 41 got, err := Base64Decode(test.String) 42 43 if test.Err { 44 if err == nil { 45 t.Fatal("succeeded; want error") 46 } 47 return 48 } else if err != nil { 49 t.Fatalf("unexpected error: %s", err) 50 } 51 52 if !got.RawEquals(test.Want) { 53 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 54 } 55 }) 56 } 57 } 58 59 func TestBase64Decode_error(t *testing.T) { 60 tests := map[string]struct { 61 String cty.Value 62 WantErr string 63 }{ 64 "invalid base64": { 65 cty.StringVal("dfg"), 66 `failed to decode base64 data "dfg"`, 67 }, 68 "sensitive invalid base64": { 69 cty.StringVal("dfg").Mark(marks.Sensitive), 70 `failed to decode base64 data (sensitive value)`, 71 }, 72 "invalid utf-8": { 73 cty.StringVal("whee"), 74 "the result of decoding the provided string is not valid UTF-8", 75 }, 76 } 77 78 for name, test := range tests { 79 t.Run(name, func(t *testing.T) { 80 _, err := Base64Decode(test.String) 81 82 if err == nil { 83 t.Fatal("succeeded; want error") 84 } 85 86 if err.Error() != test.WantErr { 87 t.Errorf("wrong error result\ngot: %#v\nwant: %#v", err.Error(), test.WantErr) 88 } 89 }) 90 } 91 } 92 93 func TestBase64Encode(t *testing.T) { 94 tests := []struct { 95 String cty.Value 96 Want cty.Value 97 Err bool 98 }{ 99 { 100 cty.StringVal("abc123!?$*&()'-=@~"), 101 cty.StringVal("YWJjMTIzIT8kKiYoKSctPUB+"), 102 false, 103 }, 104 } 105 106 for _, test := range tests { 107 t.Run(fmt.Sprintf("base64encode(%#v)", test.String), func(t *testing.T) { 108 got, err := Base64Encode(test.String) 109 110 if test.Err { 111 if err == nil { 112 t.Fatal("succeeded; want error") 113 } 114 return 115 } else if err != nil { 116 t.Fatalf("unexpected error: %s", err) 117 } 118 119 if !got.RawEquals(test.Want) { 120 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 121 } 122 }) 123 } 124 } 125 126 func TestBase64Gzip(t *testing.T) { 127 tests := []struct { 128 String cty.Value 129 Want cty.Value 130 Err bool 131 }{ 132 { 133 cty.StringVal("test"), 134 cty.StringVal("H4sIAAAAAAAA/ypJLS4BAAAA//8BAAD//wx+f9gEAAAA"), 135 false, 136 }, 137 } 138 139 for _, test := range tests { 140 t.Run(fmt.Sprintf("base64gzip(%#v)", test.String), func(t *testing.T) { 141 got, err := Base64Gzip(test.String) 142 143 if test.Err { 144 if err == nil { 145 t.Fatal("succeeded; want error") 146 } 147 return 148 } else if err != nil { 149 t.Fatalf("unexpected error: %s", err) 150 } 151 152 if !got.RawEquals(test.Want) { 153 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 154 } 155 }) 156 } 157 } 158 159 func TestURLEncode(t *testing.T) { 160 tests := []struct { 161 String cty.Value 162 Want cty.Value 163 Err bool 164 }{ 165 { 166 cty.StringVal("abc123-_"), 167 cty.StringVal("abc123-_"), 168 false, 169 }, 170 { 171 cty.StringVal("foo:bar@localhost?foo=bar&bar=baz"), 172 cty.StringVal("foo%3Abar%40localhost%3Ffoo%3Dbar%26bar%3Dbaz"), 173 false, 174 }, 175 { 176 cty.StringVal("mailto:email?subject=this+is+my+subject"), 177 cty.StringVal("mailto%3Aemail%3Fsubject%3Dthis%2Bis%2Bmy%2Bsubject"), 178 false, 179 }, 180 { 181 cty.StringVal("foo/bar"), 182 cty.StringVal("foo%2Fbar"), 183 false, 184 }, 185 } 186 187 for _, test := range tests { 188 t.Run(fmt.Sprintf("urlencode(%#v)", test.String), func(t *testing.T) { 189 got, err := URLEncode(test.String) 190 191 if test.Err { 192 if err == nil { 193 t.Fatal("succeeded; want error") 194 } 195 return 196 } else if err != nil { 197 t.Fatalf("unexpected error: %s", err) 198 } 199 200 if !got.RawEquals(test.Want) { 201 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 202 } 203 }) 204 } 205 } 206 207 func TestBase64TextEncode(t *testing.T) { 208 tests := []struct { 209 String cty.Value 210 Encoding cty.Value 211 Want cty.Value 212 Err string 213 }{ 214 { 215 cty.StringVal("abc123!?$*&()'-=@~"), 216 cty.StringVal("UTF-8"), 217 cty.StringVal("YWJjMTIzIT8kKiYoKSctPUB+"), 218 ``, 219 }, 220 { 221 cty.StringVal("abc123!?$*&()'-=@~"), 222 cty.StringVal("UTF-16LE"), 223 cty.StringVal("YQBiAGMAMQAyADMAIQA/ACQAKgAmACgAKQAnAC0APQBAAH4A"), 224 ``, 225 }, 226 { 227 cty.StringVal("abc123!?$*&()'-=@~"), 228 cty.StringVal("CP936"), 229 cty.StringVal("YWJjMTIzIT8kKiYoKSctPUB+"), 230 ``, 231 }, 232 { 233 cty.StringVal("abc123!?$*&()'-=@~"), 234 cty.StringVal("NOT-EXISTS"), 235 cty.UnknownVal(cty.String), 236 `"NOT-EXISTS" is not a supported IANA encoding name or alias in this Terraform version`, 237 }, 238 { 239 cty.StringVal("🤔"), 240 cty.StringVal("cp437"), 241 cty.UnknownVal(cty.String), 242 `the given string contains characters that cannot be represented in IBM437`, 243 }, 244 { 245 cty.UnknownVal(cty.String), 246 cty.StringVal("windows-1250"), 247 cty.UnknownVal(cty.String), 248 ``, 249 }, 250 { 251 cty.StringVal("hello world"), 252 cty.UnknownVal(cty.String), 253 cty.UnknownVal(cty.String), 254 ``, 255 }, 256 } 257 258 for _, test := range tests { 259 t.Run(fmt.Sprintf("textencodebase64(%#v, %#v)", test.String, test.Encoding), func(t *testing.T) { 260 got, err := TextEncodeBase64(test.String, test.Encoding) 261 262 if test.Err != "" { 263 if err == nil { 264 t.Fatal("succeeded; want error") 265 } 266 if got, want := err.Error(), test.Err; got != want { 267 t.Fatalf("wrong error\ngot: %s\nwant: %s", got, want) 268 } 269 return 270 } else if err != nil { 271 t.Fatalf("unexpected error: %s", err) 272 } 273 274 if !got.RawEquals(test.Want) { 275 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 276 } 277 }) 278 } 279 } 280 281 func TestBase64TextDecode(t *testing.T) { 282 tests := []struct { 283 String cty.Value 284 Encoding cty.Value 285 Want cty.Value 286 Err string 287 }{ 288 { 289 cty.StringVal("YWJjMTIzIT8kKiYoKSctPUB+"), 290 cty.StringVal("UTF-8"), 291 cty.StringVal("abc123!?$*&()'-=@~"), 292 ``, 293 }, 294 { 295 cty.StringVal("YQBiAGMAMQAyADMAIQA/ACQAKgAmACgAKQAnAC0APQBAAH4A"), 296 cty.StringVal("UTF-16LE"), 297 cty.StringVal("abc123!?$*&()'-=@~"), 298 ``, 299 }, 300 { 301 cty.StringVal("YWJjMTIzIT8kKiYoKSctPUB+"), 302 cty.StringVal("CP936"), 303 cty.StringVal("abc123!?$*&()'-=@~"), 304 ``, 305 }, 306 { 307 cty.StringVal("doesn't matter"), 308 cty.StringVal("NOT-EXISTS"), 309 cty.UnknownVal(cty.String), 310 `"NOT-EXISTS" is not a supported IANA encoding name or alias in this Terraform version`, 311 }, 312 { 313 cty.StringVal("<invalid base64>"), 314 cty.StringVal("cp437"), 315 cty.UnknownVal(cty.String), 316 `the given value is has an invalid base64 symbol at offset 0`, 317 }, 318 { 319 cty.StringVal("gQ=="), // this is 0x81, which is not defined in windows-1250 320 cty.StringVal("windows-1250"), 321 cty.StringVal("�"), 322 `the given string contains symbols that are not defined for windows-1250`, 323 }, 324 { 325 cty.UnknownVal(cty.String), 326 cty.StringVal("windows-1250"), 327 cty.UnknownVal(cty.String), 328 ``, 329 }, 330 { 331 cty.StringVal("YQBiAGMAMQAyADMAIQA/ACQAKgAmACgAKQAnAC0APQBAAH4A"), 332 cty.UnknownVal(cty.String), 333 cty.UnknownVal(cty.String), 334 ``, 335 }, 336 } 337 338 for _, test := range tests { 339 t.Run(fmt.Sprintf("textdecodebase64(%#v, %#v)", test.String, test.Encoding), func(t *testing.T) { 340 got, err := TextDecodeBase64(test.String, test.Encoding) 341 342 if test.Err != "" { 343 if err == nil { 344 t.Fatal("succeeded; want error") 345 } 346 if got, want := err.Error(), test.Err; got != want { 347 t.Fatalf("wrong error\ngot: %s\nwant: %s", got, want) 348 } 349 return 350 } else if err != nil { 351 t.Fatalf("unexpected error: %s", err) 352 } 353 354 if !got.RawEquals(test.Want) { 355 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 356 } 357 }) 358 } 359 }