mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2025-02-23 23:23:05 +08:00
322 lines
9.4 KiB
Go
322 lines
9.4 KiB
Go
|
package cloudflare
|
||
|
|
||
|
import (
|
||
|
"regexp"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/gobwas/glob"
|
||
|
)
|
||
|
|
||
|
func Test_makeSingleDirectRule(t *testing.T) {
|
||
|
tests := []struct {
|
||
|
name string
|
||
|
//
|
||
|
pattern string
|
||
|
replace string
|
||
|
//
|
||
|
wantMatch string
|
||
|
wantExpr string
|
||
|
wantErr bool
|
||
|
}{
|
||
|
{
|
||
|
name: "000",
|
||
|
pattern: "example.com/",
|
||
|
replace: "foo.com",
|
||
|
wantMatch: `http.host eq "example.com" and http.request.uri.path eq "/"`,
|
||
|
wantExpr: `"https://foo.com"`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
|
||
|
/*
|
||
|
All the test-cases I could find in dnsconfig.js
|
||
|
|
||
|
Generated with this:
|
||
|
|
||
|
dnscontrol print-ir --pretty |grep '"target' |grep , | sed -e 's@"target":@@g' > /tmp/list
|
||
|
vim /tmp/list # removed the obvious duplicates
|
||
|
awk < /tmp/list -v q='"' -F, '{ print "{" ; print "name: " q NR q "," ; print "pattern: " $1 q "," ; print "replace: " q $2 "," ; print "wantMatch: `FIXME`," ; print "wantExpr: `FIXME`," ; print "wantErr: false," ; print "}," }' | pbcopy
|
||
|
|
||
|
*/
|
||
|
|
||
|
{
|
||
|
name: "1",
|
||
|
pattern: "https://i-dev.sstatic.net/",
|
||
|
replace: "https://stackexchange.com/",
|
||
|
wantMatch: `http.host eq "i-dev.sstatic.net" and http.request.uri.path eq "/"`,
|
||
|
wantExpr: `"https://stackexchange.com/"`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "2",
|
||
|
pattern: "https://i.stack.imgur.com/*",
|
||
|
replace: "https://i.sstatic.net/$1",
|
||
|
wantMatch: `http.host eq "i.stack.imgur.com"`,
|
||
|
wantExpr: `concat("https://i.sstatic.net/", http.request.uri.path)`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "3",
|
||
|
pattern: "https://img.stack.imgur.com/*",
|
||
|
replace: "https://i.sstatic.net/$1",
|
||
|
wantMatch: `http.host eq "img.stack.imgur.com"`,
|
||
|
wantExpr: `concat("https://i.sstatic.net/", http.request.uri.path)`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "4",
|
||
|
pattern: "https://insights.stackoverflow.com/",
|
||
|
replace: "https://survey.stackoverflow.co",
|
||
|
wantMatch: `http.host eq "insights.stackoverflow.com" and http.request.uri.path eq "/"`,
|
||
|
wantExpr: `"https://survey.stackoverflow.co"`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "5",
|
||
|
pattern: "https://insights.stackoverflow.com/trends",
|
||
|
replace: "https://trends.stackoverflow.co",
|
||
|
wantMatch: `http.host eq "insights.stackoverflow.com" and http.request.uri.path eq "/trends"`,
|
||
|
wantExpr: `"https://trends.stackoverflow.co"`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "6",
|
||
|
pattern: "https://insights.stackoverflow.com/trends/",
|
||
|
replace: "https://trends.stackoverflow.co",
|
||
|
wantMatch: `http.host eq "insights.stackoverflow.com" and http.request.uri.path eq "/trends/"`,
|
||
|
wantExpr: `"https://trends.stackoverflow.co"`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "7",
|
||
|
pattern: "https://insights.stackoverflow.com/survey/2021",
|
||
|
replace: "https://survey.stackoverflow.co/2021",
|
||
|
wantMatch: `http.host eq "insights.stackoverflow.com" and http.request.uri.path eq "/survey/2021"`,
|
||
|
wantExpr: `"https://survey.stackoverflow.co/2021"`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
// {
|
||
|
// name: "27",
|
||
|
// pattern: "*www.stackoverflow.help/*",
|
||
|
// replace: "https://stackoverflow.help/$1",
|
||
|
/// FIXME(tlim): Should "$1" should be a "$2"? See dnsconfig.js:4344
|
||
|
// wantMatch: `FIXME`,
|
||
|
// wantExpr: `FIXME`,
|
||
|
// wantErr: false,
|
||
|
// },
|
||
|
{
|
||
|
name: "28",
|
||
|
pattern: "*stackoverflow.help/support/solutions/articles/36000241656-write-an-article",
|
||
|
replace: "https://stackoverflow.help/en/articles/4397209-write-an-article",
|
||
|
wantMatch: `( http.host eq "stackoverflow.help" or ends_with(http.host, ".stackoverflow.help") ) and http.request.uri.path eq "/support/solutions/articles/36000241656-write-an-article"`,
|
||
|
wantExpr: `"https://stackoverflow.help/en/articles/4397209-write-an-article"`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "29",
|
||
|
pattern: "*stackoverflow.careers/*",
|
||
|
replace: "https://careers.stackoverflow.com/$2",
|
||
|
wantMatch: `http.host eq "stackoverflow.careers" or ends_with(http.host, ".stackoverflow.careers")`,
|
||
|
wantExpr: `concat("https://careers.stackoverflow.com/", http.request.uri.path)`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "31",
|
||
|
pattern: "stackenterprise.com/*",
|
||
|
replace: "https://stackoverflow.co/teams/",
|
||
|
wantMatch: `http.host eq "stackenterprise.com"`,
|
||
|
wantExpr: `"https://stackoverflow.co/teams/"`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "33",
|
||
|
pattern: "meta.*yodeya.com/*",
|
||
|
replace: "https://judaism.meta.stackexchange.com/$2",
|
||
|
wantMatch: `http.host matches r###"^meta\..*yodeya\.com$"###`,
|
||
|
wantExpr: `concat("https://judaism.meta.stackexchange.com/", http.request.uri.path)`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "34",
|
||
|
pattern: "chat.*yodeya.com/*",
|
||
|
replace: "https://chat.stackexchange.com/?tab=site\u0026host=judaism.stackexchange.com",
|
||
|
wantMatch: `http.host matches r###"^chat\..*yodeya\.com$"###`,
|
||
|
wantExpr: `"https://chat.stackexchange.com/?tab=site&host=judaism.stackexchange.com"`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "35",
|
||
|
pattern: "*yodeya.com/*",
|
||
|
replace: "https://judaism.stackexchange.com/$2",
|
||
|
wantMatch: `http.host eq "yodeya.com" or ends_with(http.host, ".yodeya.com")`,
|
||
|
wantExpr: `concat("https://judaism.stackexchange.com/", http.request.uri.path)`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "36",
|
||
|
pattern: "meta.*seasonedadvice.com/*",
|
||
|
replace: "https://cooking.meta.stackexchange.com/$2",
|
||
|
wantMatch: `http.host matches r###"^meta\..*seasonedadvice\.com$"###`,
|
||
|
wantExpr: `concat("https://cooking.meta.stackexchange.com/", http.request.uri.path)`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "70",
|
||
|
pattern: "collectivesonstackoverflow.co/*",
|
||
|
replace: "https://stackoverflow.com/collectives-on-stack-overflow",
|
||
|
wantMatch: `http.host eq "collectivesonstackoverflow.co"`,
|
||
|
wantExpr: `"https://stackoverflow.com/collectives-on-stack-overflow"`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "71",
|
||
|
pattern: "*collectivesonstackoverflow.co/*",
|
||
|
replace: "https://stackoverflow.com/collectives-on-stack-overflow",
|
||
|
wantMatch: `http.host eq "collectivesonstackoverflow.co" or ends_with(http.host, ".collectivesonstackoverflow.co")`,
|
||
|
wantExpr: `"https://stackoverflow.com/collectives-on-stack-overflow"`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "76",
|
||
|
pattern: "*stackexchange.ca/*",
|
||
|
replace: "https://stackexchange.com/$2",
|
||
|
wantMatch: `http.host eq "stackexchange.ca" or ends_with(http.host, ".stackexchange.ca")`,
|
||
|
wantExpr: `concat("https://stackexchange.com/", http.request.uri.path)`,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
}
|
||
|
for _, tt := range tests {
|
||
|
t.Run(tt.name, func(t *testing.T) {
|
||
|
gotMatch, gotExpr, err := makeRuleFromPattern(tt.pattern, tt.replace, true)
|
||
|
if (err != nil) != tt.wantErr {
|
||
|
t.Errorf("makeSingleDirectRule() error = %v, wantErr %v", err, tt.wantErr)
|
||
|
return
|
||
|
}
|
||
|
if gotMatch != tt.wantMatch {
|
||
|
t.Errorf("makeSingleDirectRule() MATCH = %v\n want %v", gotMatch, tt.wantMatch)
|
||
|
}
|
||
|
if gotExpr != tt.wantExpr {
|
||
|
t.Errorf("makeSingleDirectRule() EXPR = %v\n want %v", gotExpr, tt.wantExpr)
|
||
|
}
|
||
|
//_ = gotType
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func Test_normalizeURL(t *testing.T) {
|
||
|
tests := []struct {
|
||
|
name string
|
||
|
s string
|
||
|
want string
|
||
|
want1 string
|
||
|
want2 string
|
||
|
wantErr bool
|
||
|
}{
|
||
|
{
|
||
|
s: "foo.com",
|
||
|
want: "https://foo.com",
|
||
|
want1: "foo.com",
|
||
|
want2: "",
|
||
|
},
|
||
|
{
|
||
|
s: "http://foo.com",
|
||
|
want: "https://foo.com",
|
||
|
want1: "foo.com",
|
||
|
want2: "",
|
||
|
},
|
||
|
{
|
||
|
s: "https://foo.com",
|
||
|
want: "https://foo.com",
|
||
|
want1: "foo.com",
|
||
|
want2: "",
|
||
|
},
|
||
|
|
||
|
{
|
||
|
s: "foo.com/bar",
|
||
|
want: "https://foo.com/bar",
|
||
|
want1: "foo.com",
|
||
|
want2: "/bar",
|
||
|
},
|
||
|
{
|
||
|
s: "http://foo.com/bar",
|
||
|
want: "https://foo.com/bar",
|
||
|
want1: "foo.com",
|
||
|
want2: "/bar",
|
||
|
},
|
||
|
{
|
||
|
s: "https://foo.com/bar",
|
||
|
want: "https://foo.com/bar",
|
||
|
want1: "foo.com",
|
||
|
want2: "/bar",
|
||
|
},
|
||
|
}
|
||
|
for _, tt := range tests {
|
||
|
t.Run(tt.name, func(t *testing.T) {
|
||
|
got, got1, got2, err := normalizeURL(tt.s)
|
||
|
if (err != nil) != tt.wantErr {
|
||
|
t.Errorf("normalizeURL() error = %v, wantErr %v", err, tt.wantErr)
|
||
|
return
|
||
|
}
|
||
|
if got != tt.want {
|
||
|
t.Errorf("normalizeURL() got = %v, want %v", got, tt.want)
|
||
|
}
|
||
|
if got1 != tt.want1 {
|
||
|
t.Errorf("normalizeURL() got1 = %v, want1 %v", got1, tt.want1)
|
||
|
}
|
||
|
if got2 != tt.want2 {
|
||
|
t.Errorf("normalizeURL() got2 = %v, want2 %v", got2, tt.want2)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func Test_simpleGlobToRegex(t *testing.T) {
|
||
|
tests := []struct {
|
||
|
name string
|
||
|
pattern string
|
||
|
want string
|
||
|
}{
|
||
|
{"1", `foo`, `^foo$`},
|
||
|
{"2", `fo.o`, `^fo\.o$`},
|
||
|
{"3", `*foo`, `.*foo$`},
|
||
|
{"4", `foo*`, `^foo.*`},
|
||
|
{"5", `f.oo*`, `^f\.oo.*`},
|
||
|
{"6", `f*oo*`, `^f.*oo.*`},
|
||
|
}
|
||
|
|
||
|
data := []string{
|
||
|
"bar",
|
||
|
"foo",
|
||
|
"foofoo",
|
||
|
"ONEfooTWO",
|
||
|
"fo",
|
||
|
"frankfodog",
|
||
|
}
|
||
|
|
||
|
for _, tt := range tests {
|
||
|
t.Run(tt.name, func(t *testing.T) {
|
||
|
got := simpleGlobToRegex(tt.pattern)
|
||
|
if got != tt.want {
|
||
|
t.Errorf("simpleGlobToRegex() = %v, want %v", got, tt.want)
|
||
|
}
|
||
|
|
||
|
// Make sure the regex compiles and gets the same result when matching against strings in data.
|
||
|
for i, d := range data {
|
||
|
|
||
|
rm, err := regexp.MatchString(got, d)
|
||
|
if err != nil {
|
||
|
t.Errorf("simpleGlobToRegex() = %003d can not compile: %v", i, err)
|
||
|
}
|
||
|
|
||
|
g := glob.MustCompile(tt.pattern)
|
||
|
gm := g.Match(d) // true
|
||
|
|
||
|
if gm != rm {
|
||
|
t.Errorf("simpleGlobToRegex() = %003d glob: %v '%v' regexp: %v '%v'", i, gm, tt.pattern, rm, got)
|
||
|
}
|
||
|
|
||
|
}
|
||
|
})
|
||
|
|
||
|
}
|
||
|
}
|