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 }