mirror of
https://github.com/alibaba/higress.git
synced 2026-02-24 12:40:48 +08:00
123 lines
3.1 KiB
Go
123 lines
3.1 KiB
Go
package expr
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/tidwall/gjson"
|
|
)
|
|
|
|
func TestStringMatcher(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
cfg string
|
|
matched []string
|
|
mismatched []string
|
|
}{
|
|
{
|
|
name: "exact",
|
|
cfg: `{"exact": "foo"}`,
|
|
matched: []string{"foo"},
|
|
mismatched: []string{"fo", "fooo"},
|
|
},
|
|
{
|
|
name: "exact, ignore_case",
|
|
cfg: `{"exact": "foo", "ignore_case": true}`,
|
|
matched: []string{"Foo", "foo"},
|
|
},
|
|
{
|
|
name: "prefix",
|
|
cfg: `{"prefix": "/p"}`,
|
|
matched: []string{"/p", "/pa"},
|
|
mismatched: []string{"/P"},
|
|
},
|
|
{
|
|
name: "prefix, ignore_case",
|
|
cfg: `{"prefix": "/p", "ignore_case": true}`,
|
|
matched: []string{"/P", "/p", "/pa", "/Pa"},
|
|
mismatched: []string{"/"},
|
|
},
|
|
{
|
|
name: "suffix",
|
|
cfg: `{"suffix": "foo"}`,
|
|
matched: []string{"foo", "0foo"},
|
|
mismatched: []string{"fo", "fooo", "aFoo"},
|
|
},
|
|
{
|
|
name: "suffix, ignore_case",
|
|
cfg: `{"suffix": "foo", "ignore_case": true}`,
|
|
matched: []string{"aFoo", "foo"},
|
|
mismatched: []string{"fo", "fooo"},
|
|
},
|
|
{
|
|
name: "contains",
|
|
cfg: `{"contains": "foo"}`,
|
|
matched: []string{"foo", "0foo", "fooo"},
|
|
mismatched: []string{"fo", "aFoo"},
|
|
},
|
|
{
|
|
name: "contains, ignore_case",
|
|
cfg: `{"contains": "foo", "ignore_case": true}`,
|
|
matched: []string{"aFoo", "foo", "FoO"},
|
|
mismatched: []string{"fo"},
|
|
},
|
|
{
|
|
name: "regex",
|
|
cfg: `{"regex": "fo{2}"}`,
|
|
matched: []string{"foo", "0foo", "fooo"},
|
|
mismatched: []string{"aFoo", "fo"},
|
|
},
|
|
{
|
|
name: "regex, ignore_case",
|
|
cfg: `{"regex": "fo{2}", "ignore_case": true}`,
|
|
matched: []string{"foo", "0foo", "fooo", "aFoo"},
|
|
mismatched: []string{"fo"},
|
|
},
|
|
{
|
|
name: "regex, ignore_case & case insensitive specified in regex",
|
|
cfg: `{"regex": "(?i)fo{2}", "ignore_case": true}`,
|
|
matched: []string{"foo", "0foo", "fooo", "aFoo"},
|
|
mismatched: []string{"fo"},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
built, _ := BuildStringMatcher(gjson.Parse(tt.cfg))
|
|
for _, s := range tt.matched {
|
|
assert.True(t, built.Match(s))
|
|
}
|
|
for _, s := range tt.mismatched {
|
|
assert.False(t, built.Match(s))
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBuildRepeatedStringMatcherIgnoreCase(t *testing.T) {
|
|
cfgs := []string{
|
|
`{"exact":"foo"}`,
|
|
`{"prefix":"pre"}`,
|
|
`{"regex":"^Cache"}`,
|
|
}
|
|
matched := []string{"Foo", "foO", "foo", "PreA", "cache-control", "Cache-Control"}
|
|
mismatched := []string{"afoo", "fo"}
|
|
ms := []gjson.Result{}
|
|
for _, cfg := range cfgs {
|
|
ms = append(ms, gjson.Parse(cfg))
|
|
}
|
|
built, _ := BuildRepeatedStringMatcherIgnoreCase(ms)
|
|
for _, s := range matched {
|
|
assert.True(t, built.Match(s))
|
|
}
|
|
for _, s := range mismatched {
|
|
assert.False(t, built.Match(s))
|
|
}
|
|
}
|
|
|
|
func TestPassOutRegexCompileErr(t *testing.T) {
|
|
cfg := `{"regex":"(?!)aa"}`
|
|
_, err := BuildRepeatedStringMatcher([]gjson.Result{gjson.Parse(cfg)})
|
|
assert.NotNil(t, err)
|
|
}
|