// 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") } }) }