73 lines
1.9 KiB
Go
73 lines
1.9 KiB
Go
// Copyright (C) 2024 Umorpha Systems
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
package gitcache
|
|
|
|
import (
|
|
"net/url"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
var normalizeURLTestcases = map[string]string{
|
|
"httpS://bogus@GitHub.com/LukeShu/repo.git/#foo": "https://github.com/LukeShu/repo.git",
|
|
"gopher://bogus@GitHub.com/LukeShu/repo.git/": "",
|
|
"git@lukeshu.com:repo.git": "ssh://git@lukeshu.com/~/repo.git",
|
|
"git@lukeshu.com:~/repo.git": "ssh://git@lukeshu.com/~/repo.git",
|
|
"git@lukeshu.com:~other/repo.git": "ssh://git@lukeshu.com/~other/repo.git",
|
|
"ssh://": "",
|
|
"/": "file:///",
|
|
"http://example.com/daemon.cgi/?svc=git&q=/": "http://example.com/daemon.cgi?svc=git&q=",
|
|
}
|
|
|
|
func TestNormalizeURL(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
for in, expOut := range normalizeURLTestcases {
|
|
in := in
|
|
expOut := expOut
|
|
t.Run(in, func(t *testing.T) {
|
|
t.Parallel()
|
|
t.Logf("in = %q", in)
|
|
actOut, ok := NormalizeURL(in)
|
|
assert.Equal(t, expOut != "", ok)
|
|
assert.Equal(t, expOut, actOut)
|
|
})
|
|
}
|
|
}
|
|
|
|
func urlScheme(url string) (string, bool) {
|
|
if !reIsURL.MatchString(url) {
|
|
return "", false
|
|
}
|
|
scheme, _, _ := strings.Cut(url, ":")
|
|
return strings.ToLower(scheme), true
|
|
}
|
|
|
|
func FuzzNormalizeURL(f *testing.F) {
|
|
for in, out := range normalizeURLTestcases {
|
|
f.Add(in)
|
|
f.Add(out)
|
|
}
|
|
f.Fuzz(func(t *testing.T, in string) {
|
|
t.Logf("in = %q", in)
|
|
out, ok := NormalizeURL(in)
|
|
if !ok {
|
|
assert.Equal(t, "", out)
|
|
return
|
|
}
|
|
u, err := url.Parse(out)
|
|
assert.NoError(t, err)
|
|
if origScheme, ok := urlScheme(in); ok {
|
|
assert.Equal(t, origScheme, u.Scheme)
|
|
}
|
|
if out != in {
|
|
out2, ok := NormalizeURL(out)
|
|
assert.True(t, ok, "output is not valid")
|
|
assert.Equal(t, out, out2, "output is not stable")
|
|
}
|
|
})
|
|
}
|