blob: c29bd9a1f749f0a28ac89cb8cfd2805f75e6724f [file] [log] [blame]
// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package fetch
import (
"context"
"errors"
"io"
"path/filepath"
"testing"
"time"
"github.com/google/go-cmp/cmp"
"golang.org/x/pkgsite/internal"
"golang.org/x/pkgsite/internal/derrors"
"golang.org/x/pkgsite/internal/proxy"
"golang.org/x/pkgsite/internal/version"
)
func TestDirectoryModuleGetterEmpty(t *testing.T) {
g, err := NewDirectoryModuleGetter("", "testdata/has_go_mod")
if err != nil {
t.Fatal(err)
}
if want := "example.com/testmod"; g.modulePath != want {
t.Errorf("got %q, want %q", g.modulePath, want)
}
_, err = NewDirectoryModuleGetter("", "testdata/no_go_mod")
if !errors.Is(err, derrors.BadModule) {
t.Errorf("got %v, want BadModule", err)
}
}
func TestEscapedPath(t *testing.T) {
for _, test := range []struct {
path, version, suffix string
want string
}{
{
"m.com", "v1", "info",
"dir/cache/download/m.com/@v/v1.info",
},
{
"github.com/aBc", "v2.3.4", "zip",
"dir/cache/download/github.com/a!bc/@v/v2.3.4.zip",
},
} {
g, err := NewFSProxyModuleGetter("dir", nil)
if err != nil {
t.Fatal(err)
}
got, err := g.escapedPath(test.path, test.version, test.suffix)
if err != nil {
t.Fatal(err)
}
want, err := filepath.Abs(test.want)
if err != nil {
t.Fatal(err)
}
if got != want {
t.Errorf("%s, %s, %s: got %q, want %q", test.path, test.version, test.suffix, got, want)
}
}
}
func TestFSProxyGetter(t *testing.T) {
ctx := context.Background()
const (
modulePath = "github.com/jackc/pgio"
vers = "v1.0.0"
goMod = "module github.com/jackc/pgio\n\ngo 1.12\n"
)
ts, err := time.Parse(time.RFC3339, "2019-03-30T17:04:38Z")
if err != nil {
t.Fatal(err)
}
g, err := NewFSProxyModuleGetter("testdata/modcache", nil)
if err != nil {
t.Fatal(err)
}
t.Run("info", func(t *testing.T) {
got, err := g.Info(ctx, modulePath, vers)
if err != nil {
t.Fatal(err)
}
want := &proxy.VersionInfo{Version: vers, Time: ts}
if !cmp.Equal(got, want) {
t.Errorf("got %+v, want %+v", got, want)
}
// Asking for latest should give the same version.
got, err = g.Info(ctx, modulePath, version.Latest)
if err != nil {
t.Fatal(err)
}
if !cmp.Equal(got, want) {
t.Errorf("got %+v, want %+v", got, want)
}
if _, err := g.Info(ctx, "nozip.com", vers); !errors.Is(err, derrors.NotFound) {
t.Errorf("got %v, want NotFound", err)
}
})
t.Run("mod", func(t *testing.T) {
got, err := g.Mod(ctx, modulePath, vers)
if err != nil {
t.Fatal(err)
}
want := []byte(goMod)
if !cmp.Equal(got, want) {
t.Errorf("got %q, want %q", got, want)
}
if _, err := g.Mod(ctx, "nozip.com", vers); !errors.Is(err, derrors.NotFound) {
t.Errorf("got %v, want NotFound", err)
}
})
t.Run("contentdir", func(t *testing.T) {
fsys, err := g.ContentDir(ctx, modulePath, vers)
if err != nil {
t.Fatal(err)
}
// Just check that the go.mod file is there and has the right contents.
f, err := fsys.Open("go.mod")
if err != nil {
t.Fatal(err)
}
defer f.Close()
got, err := io.ReadAll(f)
if err != nil {
t.Fatal(err)
}
want := []byte(goMod)
if !cmp.Equal(got, want) {
t.Errorf("got %q, want %q", got, want)
}
if _, err := g.ContentDir(ctx, "nozip.com", vers); !errors.Is(err, derrors.NotFound) {
t.Errorf("got %v, want NotFound", err)
}
})
}
func TestFSProxyGetterAllowed(t *testing.T) {
ctx := context.Background()
// The cache contains:
// github.com/jackc/pgio@v1.0.0
// modcache.com@v1.0.0
// Allow only the latter.
allow := []internal.Modver{{Path: "modcache.com", Version: "v1.0.0"}}
g, err := NewFSProxyModuleGetter("testdata/modcache", allow)
if err != nil {
t.Fatal(err)
}
check := func(path, vers string, wantOK bool) {
t.Helper()
_, err := g.Info(ctx, path, vers)
if (err == nil) != wantOK {
s := "a"
if wantOK {
s = "no"
}
t.Errorf("got %v; wanted %s error", err, s)
} else if err != nil && !errors.Is(err, derrors.NotFound) {
t.Errorf("got %v, wanted NotFound", err)
}
}
// We can get modcache.com.
check("modcache.com", "v1.0.0", true)
check("modcache.com", "latest", true)
// We get NotFound for jackc.
check("github.com/jackc/pgio", "v1.0.0", false)
check("github.com/jackc/pgio", "latest", false)
}