core: Add tests to Replacer; fix panic (fixes #2852)

This commit is contained in:
Matthew Holt 2019-11-11 19:29:31 -07:00
parent 93bc1b72e3
commit ad90b273db
No known key found for this signature in database
GPG Key ID: 2A349DD577D586A5
2 changed files with 67 additions and 10 deletions

View File

@ -116,11 +116,14 @@ func (r *replacer) replace(input, empty string,
continue
}
// write the substring from the last cursor to this point
sb.WriteString(input[lastWriteCursor:i])
// find the end of the placeholder
end := strings.Index(input[i:], string(phClose)) + i
if end < i {
continue
}
// write the substring from the last cursor to this point
sb.WriteString(input[lastWriteCursor:i])
// trim opening bracket
key := input[i+1 : end]

View File

@ -22,16 +22,62 @@ import (
"testing"
)
func fakeReplacer() replacer {
return replacer{
providers: make([]ReplacementFunc, 0),
static: make(map[string]string),
func TestReplacer(t *testing.T) {
type testCase struct {
input, expect, empty string
}
rep := testReplacer()
// ReplaceAll
for i, tc := range []testCase{
{
input: "{",
expect: "{",
},
{
input: "foo{",
expect: "foo{",
},
{
input: "foo{bar",
expect: "foo{bar",
},
{
input: "foo{bar}",
expect: "foo",
},
{
input: "}",
expect: "}",
},
{
input: "{}",
expect: "",
},
{
input: `{"json": "object"}`,
expect: "",
},
{
input: `{{`,
expect: "{{",
},
{
input: `{{}`,
expect: "",
},
} {
actual := rep.ReplaceAll(tc.input, tc.empty)
if actual != tc.expect {
t.Errorf("Test %d: '%s': expected '%s' but got '%s'",
i, tc.input, tc.expect, actual)
}
}
}
// Tests the Set method by setting some variables and check if they are added to static
func TestReplacerSet(t *testing.T) {
rep := fakeReplacer()
rep := testReplacer()
for _, tc := range []struct {
variable string
@ -191,7 +237,7 @@ func TestReplacerDelete(t *testing.T) {
}
func TestReplacerMap(t *testing.T) {
rep := fakeReplacer()
rep := testReplacer()
for i, tc := range []ReplacementFunc{
func(key string) (val string, ok bool) {
@ -228,6 +274,7 @@ func TestReplacerNew(t *testing.T) {
// test if default global replacements are added as the first provider
hostname, _ := os.Hostname()
os.Setenv("CADDY_REPLACER_TEST", "envtest")
defer os.Setenv("CADDY_REPLACER_TEST", "")
for _, tc := range []struct {
variable string
@ -267,3 +314,10 @@ func TestReplacerNew(t *testing.T) {
t.Errorf("Expected type of replacer %T got %T ", &replacer{}, tc)
}
}
func testReplacer() replacer {
return replacer{
providers: make([]ReplacementFunc, 0),
static: make(map[string]string),
}
}