From 43f3914148a17d30754a20f808e775308c771d38 Mon Sep 17 00:00:00 2001 From: sriv Date: Wed, 23 Sep 2020 08:50:34 +0530 Subject: [PATCH 1/3] enhance error message for circular references Signed-off-by: sriv --- properties.go | 7 ++++++- properties_test.go | 11 ++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/properties.go b/properties.go index 6e350a2..a4e8b62 100644 --- a/properties.go +++ b/properties.go @@ -766,7 +766,12 @@ func expand(s string, keys []string, prefix, postfix string, values map[string]s for _, k := range keys { if key == k { - return "", fmt.Errorf("circular reference in %q", key + " = " + prefix + k + postfix) + var b strings.Builder + b.WriteString("circular reference in:\n") + for _, k1 := range keys { + fmt.Fprintf(&b, "%s=%s\n", k1, values[k1]) + } + return "", fmt.Errorf(b.String()) } } diff --git a/properties_test.go b/properties_test.go index ad68ef4..c5c9a09 100644 --- a/properties_test.go +++ b/properties_test.go @@ -134,8 +134,8 @@ var errorTests = []struct { {"key\\u123", "invalid unicode literal"}, // circular references - {"key=${key}", "circular reference"}, - {"key1=${key2}\nkey2=${key1}", "circular reference"}, + {"key=${key}", "circular reference in:\nkey=${key}"}, + {"key1=${key2}\nkey2=${key1}", "circular reference in:\nkey1=${key2}\nkey2=${key1}"}, // malformed expressions {"key=${ke", "malformed expression"}, @@ -450,8 +450,8 @@ func TestComplex(t *testing.T) { func TestErrors(t *testing.T) { for _, test := range errorTests { _, err := Load([]byte(test.input), ISO_8859_1) - assert.Equal(t, err != nil, true, "want error") - assert.Equal(t, strings.Contains(err.Error(), test.msg), true) + assert.Equal(t, err != nil, true, fmt.Sprintf("want error: %s", test.input)) + assert.Equal(t, strings.Contains(err.Error(), test.msg), true, fmt.Sprintf("expected %s, got %s", test.msg, err.Error())) } } @@ -796,7 +796,8 @@ func TestSetValue(t *testing.T) { func TestMustSet(t *testing.T) { input := "key=${key}" p := mustParse(t, input) - assert.Panic(t, func() { p.MustSet("key", "${key}") }, `circular reference in "key = \$\{key\}"`) + e := `circular reference in:\nkey=\$\{key\}` + assert.Panic(t, func() { p.MustSet("key", "${key}") }, e) } func TestWrite(t *testing.T) { From 6055178460ad761402a3d84e80b8156b2552d857 Mon Sep 17 00:00:00 2001 From: sriv Date: Wed, 23 Sep 2020 11:29:53 +0530 Subject: [PATCH 2/3] use regex to match properties in any order --- properties_test.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/properties_test.go b/properties_test.go index c5c9a09..6969cf7 100644 --- a/properties_test.go +++ b/properties_test.go @@ -11,6 +11,7 @@ import ( "math" "os" "reflect" + "regexp" "runtime" "strings" "testing" @@ -134,8 +135,8 @@ var errorTests = []struct { {"key\\u123", "invalid unicode literal"}, // circular references - {"key=${key}", "circular reference in:\nkey=${key}"}, - {"key1=${key2}\nkey2=${key1}", "circular reference in:\nkey1=${key2}\nkey2=${key1}"}, + {"key=${key}", `circular reference in:\nkey=\$\{key\}`}, + {"key1=${key2}\nkey2=${key1}", `circular reference in:\n(key1=\$\{key2\}\nkey2=\$\{key1\}|key2=\$\{key1\}\nkey1=\$\{key2\})`}, // malformed expressions {"key=${ke", "malformed expression"}, @@ -451,7 +452,8 @@ func TestErrors(t *testing.T) { for _, test := range errorTests { _, err := Load([]byte(test.input), ISO_8859_1) assert.Equal(t, err != nil, true, fmt.Sprintf("want error: %s", test.input)) - assert.Equal(t, strings.Contains(err.Error(), test.msg), true, fmt.Sprintf("expected %s, got %s", test.msg, err.Error())) + re := regexp.MustCompile(test.msg) + assert.Equal(t, re.MatchString(err.Error()), true, fmt.Sprintf("expected %s, got %s", test.msg, err.Error())) } } From 3c8ae351e57e13c69f9b2b55922df3e7cebcd75b Mon Sep 17 00:00:00 2001 From: sriv Date: Wed, 23 Sep 2020 14:00:12 +0530 Subject: [PATCH 3/3] use bytes.Buffer, should work with older go versions --- properties.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/properties.go b/properties.go index a4e8b62..0d0fc28 100644 --- a/properties.go +++ b/properties.go @@ -8,6 +8,7 @@ package properties // BUG(frank): Write() does not allow to configure the newline character. Therefore, on Windows LF is used. import ( + "bytes" "fmt" "io" "log" @@ -766,7 +767,7 @@ func expand(s string, keys []string, prefix, postfix string, values map[string]s for _, k := range keys { if key == k { - var b strings.Builder + var b bytes.Buffer b.WriteString("circular reference in:\n") for _, k1 := range keys { fmt.Fprintf(&b, "%s=%s\n", k1, values[k1])