Before the parser rewrite, HCL would silently convert `\"` within interpolation braces to `"`. After the conversion, this became a syntax error. We've found several instances of Terraform configs in the wild using this syntax. It results in a hard "syntax error" message during config parsing. While avoiding the extra escape on double quotes within interpolations is definitely preferred, the UX of the syntax error feels harsh enough to be worth inserting this backwards compatibility for now, leaving us the option of deprecating it with a warning down the line.
92 lines
1.7 KiB
Go
92 lines
1.7 KiB
Go
package strconv
|
|
|
|
import "testing"
|
|
|
|
type quoteTest struct {
|
|
in string
|
|
out string
|
|
ascii string
|
|
}
|
|
|
|
var quotetests = []quoteTest{
|
|
{"\a\b\f\r\n\t\v", `"\a\b\f\r\n\t\v"`, `"\a\b\f\r\n\t\v"`},
|
|
{"\\", `"\\"`, `"\\"`},
|
|
{"abc\xffdef", `"abc\xffdef"`, `"abc\xffdef"`},
|
|
{"\u263a", `"☺"`, `"\u263a"`},
|
|
{"\U0010ffff", `"\U0010ffff"`, `"\U0010ffff"`},
|
|
{"\x04", `"\x04"`, `"\x04"`},
|
|
}
|
|
|
|
type unQuoteTest struct {
|
|
in string
|
|
out string
|
|
}
|
|
|
|
var unquotetests = []unQuoteTest{
|
|
{`""`, ""},
|
|
{`"a"`, "a"},
|
|
{`"abc"`, "abc"},
|
|
{`"☺"`, "☺"},
|
|
{`"hello world"`, "hello world"},
|
|
{`"\xFF"`, "\xFF"},
|
|
{`"\377"`, "\377"},
|
|
{`"\u1234"`, "\u1234"},
|
|
{`"\U00010111"`, "\U00010111"},
|
|
{`"\U0001011111"`, "\U0001011111"},
|
|
{`"\a\b\f\n\r\t\v\\\""`, "\a\b\f\n\r\t\v\\\""},
|
|
{`"'"`, "'"},
|
|
{`"${file("foo")}"`, `${file("foo")}`},
|
|
{`"${file(\"foo\")}"`, `${file("foo")}`},
|
|
}
|
|
|
|
var misquoted = []string{
|
|
``,
|
|
`"`,
|
|
`"a`,
|
|
`"'`,
|
|
`b"`,
|
|
`"\"`,
|
|
`"\9"`,
|
|
`"\19"`,
|
|
`"\129"`,
|
|
`'\'`,
|
|
`'\9'`,
|
|
`'\19'`,
|
|
`'\129'`,
|
|
`'ab'`,
|
|
`"\x1!"`,
|
|
`"\U12345678"`,
|
|
`"\z"`,
|
|
"`",
|
|
"`xxx",
|
|
"`\"",
|
|
`"\'"`,
|
|
`'\"'`,
|
|
"\"\n\"",
|
|
"\"\\n\n\"",
|
|
"'\n'",
|
|
`"${"`,
|
|
`"${foo{}"`,
|
|
}
|
|
|
|
func TestUnquote(t *testing.T) {
|
|
for _, tt := range unquotetests {
|
|
if out, err := Unquote(tt.in); err != nil || out != tt.out {
|
|
t.Errorf("Unquote(%#q) = %q, %v want %q, nil", tt.in, out, err, tt.out)
|
|
}
|
|
}
|
|
|
|
// run the quote tests too, backward
|
|
for _, tt := range quotetests {
|
|
if in, err := Unquote(tt.out); in != tt.in {
|
|
t.Errorf("Unquote(%#q) = %q, %v, want %q, nil", tt.out, in, err, tt.in)
|
|
}
|
|
}
|
|
|
|
for _, s := range misquoted {
|
|
if out, err := Unquote(s); out != "" || err != ErrSyntax {
|
|
t.Errorf("Unquote(%#q) = %q, %v want %q, %v", s, out, err, "", ErrSyntax)
|
|
}
|
|
}
|
|
}
|