github.com/golang/dep@v0.5.4/cmd/dep/gopath_scanner_test.go (about)

     1  // Copyright 2016 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"io/ioutil"
     9  	"log"
    10  	"reflect"
    11  	"testing"
    12  
    13  	"github.com/golang/dep"
    14  	"github.com/golang/dep/gps"
    15  	"github.com/golang/dep/internal/test"
    16  )
    17  
    18  const testProject1 = "github.com/sdboyer/deptest"
    19  const testProject2 = "github.com/sdboyer/deptestdos"
    20  
    21  // NewTestContext creates a unique context with its own GOPATH for a single test.
    22  func NewTestContext(h *test.Helper) *dep.Ctx {
    23  	h.TempDir("src")
    24  	pwd := h.Path(".")
    25  	discardLogger := log.New(ioutil.Discard, "", 0)
    26  
    27  	return &dep.Ctx{
    28  		GOPATH: pwd,
    29  		Out:    discardLogger,
    30  		Err:    discardLogger,
    31  	}
    32  }
    33  
    34  func TestGopathScanner_OverlayManifestConstraints(t *testing.T) {
    35  	h := test.NewHelper(t)
    36  	h.Parallel()
    37  	defer h.Cleanup()
    38  
    39  	ctx := NewTestContext(h)
    40  
    41  	pi1 := gps.ProjectIdentifier{ProjectRoot: gps.ProjectRoot(testProject1)}
    42  	pi2 := gps.ProjectIdentifier{ProjectRoot: gps.ProjectRoot(testProject2)}
    43  	v1 := gps.NewVersion("v1.0.0")
    44  	v2 := gps.NewVersion("v2.0.0")
    45  	v3 := gps.NewVersion("v3.0.0")
    46  	rootM := dep.NewManifest()
    47  	rootM.Constraints[pi1.ProjectRoot] = gps.ProjectProperties{Constraint: v1}
    48  	rootL := &dep.Lock{}
    49  	origM := dep.NewManifest()
    50  	origM.Constraints[pi1.ProjectRoot] = gps.ProjectProperties{Constraint: v2}
    51  	origM.Constraints[pi2.ProjectRoot] = gps.ProjectProperties{Constraint: v3}
    52  	gs := gopathScanner{
    53  		origM: origM,
    54  		origL: &dep.Lock{},
    55  		ctx:   ctx,
    56  		pd: projectData{
    57  			ondisk: map[gps.ProjectRoot]gps.Version{
    58  				pi1.ProjectRoot: v2,
    59  				pi2.ProjectRoot: v3,
    60  			},
    61  		},
    62  	}
    63  
    64  	gs.overlay(rootM, rootL)
    65  
    66  	dep, has := rootM.Constraints[pi1.ProjectRoot]
    67  	if !has {
    68  		t.Fatalf("Expected the root manifest to contain %s", pi1.ProjectRoot)
    69  	}
    70  	wantC := v1.String()
    71  	gotC := dep.Constraint.String()
    72  	if wantC != gotC {
    73  		t.Fatalf("Expected %s to be constrained to '%s', got '%s'", pi1.ProjectRoot, wantC, gotC)
    74  	}
    75  
    76  	dep, has = rootM.Constraints[pi2.ProjectRoot]
    77  	if !has {
    78  		t.Fatalf("Expected the root manifest to contain %s", pi2.ProjectRoot)
    79  	}
    80  	wantC = v3.String()
    81  	gotC = dep.Constraint.String()
    82  	if wantC != gotC {
    83  		t.Fatalf("Expected %s to be constrained to '%s', got '%s'", pi2.ProjectRoot, wantC, gotC)
    84  	}
    85  }
    86  
    87  func TestGopathScanner_OverlayLockProjects(t *testing.T) {
    88  	h := test.NewHelper(t)
    89  	h.Parallel()
    90  	defer h.Cleanup()
    91  
    92  	ctx := NewTestContext(h)
    93  
    94  	rootM := dep.NewManifest()
    95  	pi1 := gps.ProjectIdentifier{ProjectRoot: gps.ProjectRoot(testProject1)}
    96  	pi2 := gps.ProjectIdentifier{ProjectRoot: gps.ProjectRoot(testProject2)}
    97  	v1 := gps.NewVersion("v1.0.0")
    98  	v2 := gps.NewVersion("v2.0.0")
    99  	v3 := gps.NewVersion("v3.0.0")
   100  	rootL := &dep.Lock{
   101  		P: []gps.LockedProject{gps.NewLockedProject(pi1, v1, []string{})},
   102  	}
   103  	gs := gopathScanner{
   104  		origM: dep.NewManifest(),
   105  		origL: &dep.Lock{
   106  			P: []gps.LockedProject{
   107  				gps.NewLockedProject(pi1, v2, []string{}), // ignored, already exists in lock
   108  				gps.NewLockedProject(pi2, v3, []string{}), // should be added to the lock
   109  			},
   110  		},
   111  		ctx: ctx,
   112  		pd: projectData{
   113  			ondisk: map[gps.ProjectRoot]gps.Version{
   114  				pi1.ProjectRoot: v2,
   115  				pi2.ProjectRoot: v3,
   116  			},
   117  		},
   118  	}
   119  
   120  	gs.overlay(rootM, rootL)
   121  
   122  	if len(rootL.P) != 2 {
   123  		t.Fatalf("Expected the root manifest to contain 2 packages, got %d", len(rootL.P))
   124  	}
   125  
   126  	if rootL.P[0].Version() != v1 {
   127  		t.Fatalf("Expected %s to be locked to '%s', got '%s'", rootL.P[0].Ident().ProjectRoot, v1, rootL.P[0].Version())
   128  	}
   129  
   130  	if rootL.P[1].Version() != v3 {
   131  		t.Fatalf("Expected %s to be locked to '%s', got '%s'", rootL.P[1].Ident().ProjectRoot, v3, rootL.P[1].Version())
   132  	}
   133  }
   134  
   135  func TestContains(t *testing.T) {
   136  	t.Parallel()
   137  	a := []string{"a", "b", "abcd"}
   138  
   139  	if !contains(a, "a") {
   140  		t.Fatal("expected array to contain 'a'")
   141  	}
   142  	if contains(a, "d") {
   143  		t.Fatal("expected array to not contain 'd'")
   144  	}
   145  }
   146  
   147  func TestGetProjectPropertiesFromVersion(t *testing.T) {
   148  	t.Parallel()
   149  	wantSemver, _ := gps.NewSemverConstraintIC("v1.0.0")
   150  	cases := []struct {
   151  		version, want gps.Constraint
   152  	}{
   153  		{
   154  			version: gps.NewBranch("foo-branch"),
   155  			want:    gps.NewBranch("foo-branch"),
   156  		},
   157  		{
   158  			version: gps.NewVersion("foo-version"),
   159  			want:    gps.NewVersion("foo-version"),
   160  		},
   161  		{
   162  			version: gps.NewVersion("v1.0.0"),
   163  			want:    wantSemver,
   164  		},
   165  		{
   166  			version: gps.NewBranch("foo-branch").Pair("some-revision"),
   167  			want:    gps.NewBranch("foo-branch"),
   168  		},
   169  		{
   170  			version: gps.NewVersion("foo-version").Pair("some-revision"),
   171  			want:    gps.NewVersion("foo-version"),
   172  		},
   173  		{
   174  			version: gps.Revision("some-revision"),
   175  			want:    nil,
   176  		},
   177  		{
   178  			version: gps.NewVersion("v1.0.0").Pair("some-revision"),
   179  			want:    wantSemver,
   180  		},
   181  	}
   182  
   183  	for _, c := range cases {
   184  		actualProp := getProjectPropertiesFromVersion(c.version.(gps.Version))
   185  		if !reflect.DeepEqual(c.want, actualProp.Constraint) {
   186  			t.Fatalf("Constraints are not as expected: \n\t(GOT) %v\n\t(WNT) %v", actualProp.Constraint, c.want)
   187  		}
   188  	}
   189  }