mirror of https://github.com/golang/go.git
cmd/go/internal/modfetch/codehost: initialize localGitURL lazily and clean up skips
Previously localGitURL was initialized in TestMain, which creates needless work if the test flags do not result in running a test that requires localGitURL. We had also been skipping a bunch of tests that used vcs-test.golang.org in order to avoid network traffic, but now that that content is served through an in-process vcweb server that is no longer necessary. (All of the 'git' tests together take less than a second to run.) The 'hg' tests are much slower, so we do still skip those in short mode. Updates #59940. Change-Id: Ie4f2d2bc825d7a011e25e754edf1a7c3c6010c77 Reviewed-on: https://go-review.googlesource.com/c/go/+/491659 Reviewed-by: Michael Matloob <matloob@golang.org> Auto-Submit: Bryan Mills <bcmills@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Bryan Mills <bcmills@google.com>
This commit is contained in:
parent
dcd1c31032
commit
09a24a91b5
|
|
@ -15,25 +15,24 @@ import (
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMain(m *testing.M) {
|
func TestMain(m *testing.M) {
|
||||||
// needed for initializing the test environment variables as testing.Short
|
|
||||||
// and HasExternalNetwork
|
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
if err := testMain(m); err != nil {
|
if err := testMain(m); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var gitrepo1, hgrepo1 string
|
var gitrepo1, hgrepo1, vgotest1 string
|
||||||
|
|
||||||
var altRepos = func() []string {
|
var altRepos = func() []string {
|
||||||
return []string{
|
return []string{
|
||||||
|
|
@ -45,8 +44,48 @@ var altRepos = func() []string {
|
||||||
// TODO: Convert gitrepo1 to svn, bzr, fossil and add tests.
|
// TODO: Convert gitrepo1 to svn, bzr, fossil and add tests.
|
||||||
// For now, at least the hgrepo1 tests check the general vcs.go logic.
|
// For now, at least the hgrepo1 tests check the general vcs.go logic.
|
||||||
|
|
||||||
// localGitRepo is like gitrepo1 but allows archive access.
|
// localGitRepo is like gitrepo1 but allows archive access
|
||||||
var localGitRepo, localGitURL string
|
// (although that doesn't really matter after CL 120041),
|
||||||
|
// and has a file:// URL instead of http:// or https://
|
||||||
|
// (which might still matter).
|
||||||
|
var localGitRepo string
|
||||||
|
|
||||||
|
// localGitURL initializes the repo in localGitRepo and returns its URL.
|
||||||
|
func localGitURL(t testing.TB) string {
|
||||||
|
testenv.MustHaveExecPath(t, "git")
|
||||||
|
if runtime.GOOS == "android" && strings.HasSuffix(testenv.Builder(), "-corellium") {
|
||||||
|
testenv.SkipFlaky(t, 59940)
|
||||||
|
}
|
||||||
|
|
||||||
|
localGitURLOnce.Do(func() {
|
||||||
|
// Clone gitrepo1 into a local directory.
|
||||||
|
// If we use a file:// URL to access the local directory,
|
||||||
|
// then git starts up all the usual protocol machinery,
|
||||||
|
// which will let us test remote git archive invocations.
|
||||||
|
_, localGitURLErr = Run("", "git", "clone", "--mirror", gitrepo1, localGitRepo)
|
||||||
|
if localGitURLErr != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, localGitURLErr = Run(localGitRepo, "git", "config", "daemon.uploadarch", "true")
|
||||||
|
})
|
||||||
|
|
||||||
|
if localGitURLErr != nil {
|
||||||
|
t.Fatal(localGitURLErr)
|
||||||
|
}
|
||||||
|
// Convert absolute path to file URL. LocalGitRepo will not accept
|
||||||
|
// Windows absolute paths because they look like a host:path remote.
|
||||||
|
// TODO(golang.org/issue/32456): use url.FromFilePath when implemented.
|
||||||
|
if strings.HasPrefix(localGitRepo, "/") {
|
||||||
|
return "file://" + localGitRepo
|
||||||
|
} else {
|
||||||
|
return "file:///" + filepath.ToSlash(localGitRepo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
localGitURLOnce sync.Once
|
||||||
|
localGitURLErr error
|
||||||
|
)
|
||||||
|
|
||||||
func testMain(m *testing.M) (err error) {
|
func testMain(m *testing.M) (err error) {
|
||||||
cfg.BuildX = true
|
cfg.BuildX = true
|
||||||
|
|
@ -63,6 +102,7 @@ func testMain(m *testing.M) (err error) {
|
||||||
|
|
||||||
gitrepo1 = srv.HTTP.URL + "/git/gitrepo1"
|
gitrepo1 = srv.HTTP.URL + "/git/gitrepo1"
|
||||||
hgrepo1 = srv.HTTP.URL + "/hg/hgrepo1"
|
hgrepo1 = srv.HTTP.URL + "/hg/hgrepo1"
|
||||||
|
vgotest1 = srv.HTTP.URL + "/git/vgotest1"
|
||||||
|
|
||||||
dir, err := os.MkdirTemp("", "gitrepo-test-")
|
dir, err := os.MkdirTemp("", "gitrepo-test-")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -74,44 +114,20 @@ func testMain(m *testing.M) (err error) {
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
localGitRepo = filepath.Join(dir, "gitrepo2")
|
||||||
|
|
||||||
// Redirect the module cache to a fresh directory to avoid crosstalk, and make
|
// Redirect the module cache to a fresh directory to avoid crosstalk, and make
|
||||||
// it read/write so that the test can still clean it up easily when done.
|
// it read/write so that the test can still clean it up easily when done.
|
||||||
cfg.GOMODCACHE = filepath.Join(dir, "modcache")
|
cfg.GOMODCACHE = filepath.Join(dir, "modcache")
|
||||||
cfg.ModCacheRW = true
|
cfg.ModCacheRW = true
|
||||||
|
|
||||||
if !testing.Short() && testenv.HasExec() {
|
|
||||||
if _, err := exec.LookPath("git"); err == nil {
|
|
||||||
// Clone gitrepo1 into a local directory.
|
|
||||||
// If we use a file:// URL to access the local directory,
|
|
||||||
// then git starts up all the usual protocol machinery,
|
|
||||||
// which will let us test remote git archive invocations.
|
|
||||||
localGitRepo = filepath.Join(dir, "gitrepo2")
|
|
||||||
if _, err := Run("", "git", "clone", "--mirror", gitrepo1, localGitRepo); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err := Run(localGitRepo, "git", "config", "daemon.uploadarch", "true"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert absolute path to file URL. LocalGitRepo will not accept
|
|
||||||
// Windows absolute paths because they look like a host:path remote.
|
|
||||||
// TODO(golang.org/issue/32456): use url.FromFilePath when implemented.
|
|
||||||
if strings.HasPrefix(localGitRepo, "/") {
|
|
||||||
localGitURL = "file://" + localGitRepo
|
|
||||||
} else {
|
|
||||||
localGitURL = "file:///" + filepath.ToSlash(localGitRepo)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m.Run()
|
m.Run()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func testRepo(t *testing.T, remote string) (Repo, error) {
|
func testRepo(t *testing.T, remote string) (Repo, error) {
|
||||||
if remote == "localGitRepo" {
|
if remote == "localGitRepo" {
|
||||||
testenv.MustHaveExecPath(t, "git")
|
return LocalGitRepo(localGitURL(t))
|
||||||
return LocalGitRepo(localGitURL)
|
|
||||||
}
|
}
|
||||||
vcsName := "git"
|
vcsName := "git"
|
||||||
for _, k := range []string{"hg"} {
|
for _, k := range []string{"hg"} {
|
||||||
|
|
@ -119,13 +135,17 @@ func testRepo(t *testing.T, remote string) (Repo, error) {
|
||||||
vcsName = k
|
vcsName = k
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if testing.Short() && vcsName == "hg" {
|
||||||
|
t.Skipf("skipping hg test in short mode: hg is slow")
|
||||||
|
}
|
||||||
testenv.MustHaveExecPath(t, vcsName)
|
testenv.MustHaveExecPath(t, vcsName)
|
||||||
|
if runtime.GOOS == "android" && strings.HasSuffix(testenv.Builder(), "-corellium") {
|
||||||
|
testenv.SkipFlaky(t, 59940)
|
||||||
|
}
|
||||||
return NewRepo(vcsName, remote)
|
return NewRepo(vcsName, remote)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTags(t *testing.T) {
|
func TestTags(t *testing.T) {
|
||||||
testenv.MustHaveExternalNetwork(t)
|
|
||||||
testenv.MustHaveExec(t)
|
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
type tagsTest struct {
|
type tagsTest struct {
|
||||||
|
|
@ -195,8 +215,6 @@ func TestTags(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLatest(t *testing.T) {
|
func TestLatest(t *testing.T) {
|
||||||
testenv.MustHaveExternalNetwork(t)
|
|
||||||
testenv.MustHaveExec(t)
|
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
type latestTest struct {
|
type latestTest struct {
|
||||||
|
|
@ -260,15 +278,13 @@ func TestLatest(t *testing.T) {
|
||||||
tt.info = &info
|
tt.info = &info
|
||||||
o := *info.Origin
|
o := *info.Origin
|
||||||
info.Origin = &o
|
info.Origin = &o
|
||||||
o.URL = localGitURL
|
o.URL = localGitURL(t)
|
||||||
t.Run(path.Base(tt.repo), runTest(tt))
|
t.Run(path.Base(tt.repo), runTest(tt))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestReadFile(t *testing.T) {
|
func TestReadFile(t *testing.T) {
|
||||||
testenv.MustHaveExternalNetwork(t)
|
|
||||||
testenv.MustHaveExec(t)
|
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
type readFileTest struct {
|
type readFileTest struct {
|
||||||
|
|
@ -343,8 +359,6 @@ type zipFile struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestReadZip(t *testing.T) {
|
func TestReadZip(t *testing.T) {
|
||||||
testenv.MustHaveExternalNetwork(t)
|
|
||||||
testenv.MustHaveExec(t)
|
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
type readZipTest struct {
|
type readZipTest struct {
|
||||||
|
|
@ -535,7 +549,7 @@ func TestReadZip(t *testing.T) {
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
repo: "https://github.com/rsc/vgotest1",
|
repo: vgotest1,
|
||||||
rev: "submod/v1.0.4",
|
rev: "submod/v1.0.4",
|
||||||
subdir: "submod",
|
subdir: "submod",
|
||||||
files: map[string]uint64{
|
files: map[string]uint64{
|
||||||
|
|
@ -564,8 +578,6 @@ var hgmap = map[string]string{
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestStat(t *testing.T) {
|
func TestStat(t *testing.T) {
|
||||||
testenv.MustHaveExternalNetwork(t)
|
|
||||||
testenv.MustHaveExec(t)
|
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
type statTest struct {
|
type statTest struct {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue