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