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 5package dep 6 7import ( 8 "reflect" 9 "strings" 10 "testing" 11 12 "github.com/golang/dep/gps" 13 "github.com/golang/dep/gps/verify" 14 "github.com/golang/dep/internal/test" 15) 16 17func TestReadLock(t *testing.T) { 18 h := test.NewHelper(t) 19 defer h.Cleanup() 20 21 golden := "lock/golden0.toml" 22 g0f := h.GetTestFile(golden) 23 defer g0f.Close() 24 got, err := readLock(g0f) 25 if err != nil { 26 t.Fatalf("Should have read Lock correctly, but got err %q", err) 27 } 28 29 want := &Lock{ 30 SolveMeta: SolveMeta{InputImports: []string{}}, 31 P: []gps.LockedProject{ 32 verify.VerifiableProject{ 33 LockedProject: gps.NewLockedProject( 34 gps.ProjectIdentifier{ProjectRoot: gps.ProjectRoot("github.com/golang/dep")}, 35 gps.NewBranch("master").Pair(gps.Revision("d05d5aca9f895d19e9265839bffeadd74a2d2ecb")), 36 []string{"."}, 37 ), 38 PruneOpts: gps.PruneOptions(1), 39 Digest: verify.VersionedDigest{ 40 HashVersion: verify.HashVersion, 41 Digest: []byte("foo"), 42 }, 43 }, 44 }, 45 } 46 47 if !reflect.DeepEqual(got, want) { 48 t.Error("Valid lock did not parse as expected") 49 } 50 51 golden = "lock/golden1.toml" 52 g1f := h.GetTestFile(golden) 53 defer g1f.Close() 54 got, err = readLock(g1f) 55 if err != nil { 56 t.Fatalf("Should have read Lock correctly, but got err %q", err) 57 } 58 59 want = &Lock{ 60 SolveMeta: SolveMeta{InputImports: []string{}}, 61 P: []gps.LockedProject{ 62 verify.VerifiableProject{ 63 LockedProject: gps.NewLockedProject( 64 gps.ProjectIdentifier{ProjectRoot: gps.ProjectRoot("github.com/golang/dep")}, 65 gps.NewVersion("0.12.2").Pair(gps.Revision("d05d5aca9f895d19e9265839bffeadd74a2d2ecb")), 66 []string{"."}, 67 ), 68 PruneOpts: gps.PruneOptions(15), 69 Digest: verify.VersionedDigest{ 70 HashVersion: verify.HashVersion, 71 Digest: []byte("foo"), 72 }, 73 }, 74 }, 75 } 76 77 if !reflect.DeepEqual(got, want) { 78 t.Error("Valid lock did not parse as expected") 79 } 80} 81 82func TestWriteLock(t *testing.T) { 83 h := test.NewHelper(t) 84 defer h.Cleanup() 85 86 golden := "lock/golden0.toml" 87 want := h.GetTestFileString(golden) 88 l := &Lock{ 89 P: []gps.LockedProject{ 90 verify.VerifiableProject{ 91 LockedProject: gps.NewLockedProject( 92 gps.ProjectIdentifier{ProjectRoot: gps.ProjectRoot("github.com/golang/dep")}, 93 gps.NewBranch("master").Pair(gps.Revision("d05d5aca9f895d19e9265839bffeadd74a2d2ecb")), 94 []string{"."}, 95 ), 96 PruneOpts: gps.PruneOptions(1), 97 Digest: verify.VersionedDigest{ 98 HashVersion: verify.HashVersion, 99 Digest: []byte("foo"), 100 }, 101 }, 102 }, 103 } 104 105 got, err := l.MarshalTOML() 106 if err != nil { 107 t.Fatalf("Error while marshaling valid lock to TOML: %q", err) 108 } 109 110 if string(got) != want { 111 if *test.UpdateGolden { 112 if err = h.WriteTestFile(golden, string(got)); err != nil { 113 t.Fatal(err) 114 } 115 } else { 116 t.Errorf("Valid lock did not marshal to TOML as expected:\n\t(GOT): %s\n\t(WNT): %s", string(got), want) 117 } 118 } 119 120 golden = "lock/golden1.toml" 121 want = h.GetTestFileString(golden) 122 l = &Lock{ 123 P: []gps.LockedProject{ 124 verify.VerifiableProject{ 125 LockedProject: gps.NewLockedProject( 126 gps.ProjectIdentifier{ProjectRoot: gps.ProjectRoot("github.com/golang/dep")}, 127 gps.NewVersion("0.12.2").Pair(gps.Revision("d05d5aca9f895d19e9265839bffeadd74a2d2ecb")), 128 []string{"."}, 129 ), 130 PruneOpts: gps.PruneOptions(15), 131 Digest: verify.VersionedDigest{ 132 HashVersion: verify.HashVersion, 133 Digest: []byte("foo"), 134 }, 135 }, 136 }, 137 } 138 139 got, err = l.MarshalTOML() 140 if err != nil { 141 t.Fatalf("Error while marshaling valid lock to TOML: %q", err) 142 } 143 144 if string(got) != want { 145 if *test.UpdateGolden { 146 if err = h.WriteTestFile(golden, string(got)); err != nil { 147 t.Fatal(err) 148 } 149 } else { 150 t.Errorf("Valid lock did not marshal to TOML as expected:\n\t(GOT): %s\n\t(WNT): %s", string(got), want) 151 } 152 } 153} 154 155func TestReadLockErrors(t *testing.T) { 156 h := test.NewHelper(t) 157 defer h.Cleanup() 158 var err error 159 160 tests := []struct { 161 name string 162 file string 163 }{ 164 {"specified both", "lock/error0.toml"}, 165 {"odd length", "lock/error1.toml"}, 166 {"no branch or version", "lock/error2.toml"}, 167 } 168 169 for _, tst := range tests { 170 lf := h.GetTestFile(tst.file) 171 defer lf.Close() 172 _, err = readLock(lf) 173 if err == nil { 174 t.Errorf("Reading lock with %s should have caused error, but did not", tst.name) 175 } else if !strings.Contains(err.Error(), tst.name) { 176 t.Errorf("Unexpected error %q; expected %s error", err, tst.name) 177 } 178 } 179} 180