blob: 6debaee6395aca2669e3543aba54c04de444bce5 [file] [log] [blame]
// Copyright 2017 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 gps
import (
"context"
"fmt"
"io/ioutil"
"log"
"os"
"path/filepath"
"testing"
"github.com/golang/dep/gps/pkgtree"
"github.com/golang/dep/internal/test"
)
// Executed in parallel by TestSlowVcs
func testSourceGateway(t *testing.T) {
t.Parallel()
if testing.Short() {
t.Skip("Skipping gateway testing in short mode")
}
requiresBins(t, "git")
cachedir, err := ioutil.TempDir("", "smcache")
if err != nil {
t.Fatalf("failed to create temp dir: %s", err)
}
bgc := context.Background()
ctx, cancelFunc := context.WithCancel(bgc)
defer func() {
os.RemoveAll(cachedir)
cancelFunc()
}()
os.Mkdir(filepath.Join(cachedir, "sources"), 0777)
do := func(wantstate sourceState) func(t *testing.T) {
return func(t *testing.T) {
superv := newSupervisor(ctx)
deducer := newDeductionCoordinator(superv)
logger := log.New(test.Writer{TB: t}, "", 0)
sc := newSourceCoordinator(superv, deducer, cachedir, nil, logger)
defer sc.close()
id := mkPI("github.com/sdboyer/deptest")
sg, err := sc.getSourceGatewayFor(ctx, id)
if err != nil {
t.Fatal(err)
}
if sg.srcState != wantstate {
t.Fatalf("expected state to be %q, got %q", wantstate, sg.srcState)
}
if err := sg.existsUpstream(ctx); err != nil {
t.Fatalf("failed to verify upstream source: %s", err)
}
wantstate |= sourceExistsUpstream
if sg.src.existsCallsListVersions() {
wantstate |= sourceHasLatestVersionList
}
if sg.srcState != wantstate {
t.Fatalf("expected state to be %q, got %q", wantstate, sg.srcState)
}
if err := sg.syncLocal(ctx); err != nil {
t.Fatalf("error on cloning git repo: %s", err)
}
wantstate |= sourceExistsLocally | sourceHasLatestLocally
if sg.srcState != wantstate {
t.Fatalf("expected state to be %q, got %q", wantstate, sg.srcState)
}
if _, ok := sg.src.(*gitSource); !ok {
t.Fatalf("Expected a gitSource, got a %T", sg.src)
}
vlist, err := sg.listVersions(ctx)
if err != nil {
t.Fatalf("Unexpected error getting version pairs from git repo: %s", err)
}
wantstate |= sourceHasLatestVersionList
if sg.srcState != wantstate {
t.Fatalf("expected state to be %q, got %q", wantstate, sg.srcState)
}
if len(vlist) != 4 {
t.Fatalf("git test repo should've produced four versions, got %v: vlist was %s", len(vlist), vlist)
} else {
SortPairedForUpgrade(vlist)
evl := []PairedVersion{
NewVersion("v1.0.0").Pair(Revision("ff2948a2ac8f538c4ecd55962e919d1e13e74baf")),
NewVersion("v0.8.1").Pair(Revision("3f4c3bea144e112a69bbe5d8d01c1b09a544253f")),
NewVersion("v0.8.0").Pair(Revision("ff2948a2ac8f538c4ecd55962e919d1e13e74baf")),
newDefaultBranch("master").Pair(Revision("3f4c3bea144e112a69bbe5d8d01c1b09a544253f")),
}
if len(evl) != len(vlist) {
t.Errorf("expected %d versions but got %d", len(evl), len(vlist))
} else {
for i := range evl {
if !evl[i].identical(vlist[i]) {
t.Errorf("index %d: expected version identical to %#v but got %#v", i, evl[i], vlist[i])
}
}
}
}
rev := Revision("c575196502940c07bf89fd6d95e83b999162e051")
// check that an expected rev is not in cache
_, has := sg.cache.getVersionsFor(rev)
if has {
t.Fatal("shouldn't have bare revs in cache without specifically requesting them")
}
is, err := sg.revisionPresentIn(ctx, rev)
if err != nil {
t.Fatalf("unexpected error while checking revision presence: %s", err)
} else if !is {
t.Fatalf("revision that should exist was not present")
}
// check that an expected rev is not in cache
_, has = sg.cache.getVersionsFor(rev)
if !has {
t.Fatal("bare rev should be in cache after specific request for it")
}
// Ensure that a bad rev doesn't work on any method that takes
// versions
badver := NewVersion("notexist")
wanterr := fmt.Errorf("version %q does not exist in source", badver)
_, _, err = sg.getManifestAndLock(ctx, ProjectRoot("github.com/sdboyer/deptest"), badver, naiveAnalyzer{})
if err == nil {
t.Fatal("wanted err on nonexistent version")
} else if err.Error() != wanterr.Error() {
t.Fatalf("wanted nonexistent err when passing bad version, got: %s", err)
}
_, err = sg.listPackages(ctx, ProjectRoot("github.com/sdboyer/deptest"), badver)
if err == nil {
t.Fatal("wanted err on nonexistent version")
} else if err.Error() != wanterr.Error() {
t.Fatalf("wanted nonexistent err when passing bad version, got: %s", err)
}
err = sg.exportVersionTo(ctx, badver, cachedir)
if err == nil {
t.Fatal("wanted err on nonexistent version")
} else if err.Error() != wanterr.Error() {
t.Fatalf("wanted nonexistent err when passing bad version, got: %s", err)
}
wantptree := pkgtree.PackageTree{
ImportRoot: "github.com/sdboyer/deptest",
Packages: map[string]pkgtree.PackageOrErr{
"github.com/sdboyer/deptest": {
P: pkgtree.Package{
ImportPath: "github.com/sdboyer/deptest",
Name: "deptest",
Imports: []string{},
},
},
},
}
ptree, err := sg.listPackages(ctx, ProjectRoot("github.com/sdboyer/deptest"), Revision("ff2948a2ac8f538c4ecd55962e919d1e13e74baf"))
if err != nil {
t.Fatalf("unexpected err when getting package tree with known rev: %s", err)
}
comparePackageTree(t, wantptree, ptree)
ptree, err = sg.listPackages(ctx, ProjectRoot("github.com/sdboyer/deptest"), NewVersion("v1.0.0"))
if err != nil {
t.Fatalf("unexpected err when getting package tree with unpaired good version: %s", err)
}
comparePackageTree(t, wantptree, ptree)
}
}
// Run test twice so that we cover both the existing and non-existing case.
t.Run("empty", do(sourceExistsUpstream|sourceHasLatestVersionList))
t.Run("exists", do(sourceExistsLocally))
}