github.com/hasnat/dolt/go@v0.0.0-20210628190320-9eb5d843fbb7/libraries/doltcore/env/actions/commitwalk/commitwalk_test.go (about) 1 // Copyright 2019 Dolthub, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package commitwalk 16 17 import ( 18 "context" 19 "testing" 20 21 "github.com/stretchr/testify/assert" 22 "github.com/stretchr/testify/require" 23 24 "github.com/dolthub/dolt/go/libraries/doltcore/doltdb" 25 "github.com/dolthub/dolt/go/libraries/doltcore/env" 26 "github.com/dolthub/dolt/go/libraries/doltcore/ref" 27 "github.com/dolthub/dolt/go/libraries/utils/filesys" 28 "github.com/dolthub/dolt/go/store/datas" 29 "github.com/dolthub/dolt/go/store/hash" 30 "github.com/dolthub/dolt/go/store/types" 31 ) 32 33 const ( 34 testHomeDir = "/doesnotexist/home" 35 workingDir = "/doesnotexist/work" 36 ) 37 38 func testHomeDirFunc() (string, error) { 39 return testHomeDir, nil 40 } 41 42 func createUninitializedEnv() *env.DoltEnv { 43 initialDirs := []string{testHomeDir, workingDir} 44 fs := filesys.NewInMemFS(initialDirs, nil, workingDir) 45 dEnv := env.Load(context.Background(), testHomeDirFunc, fs, doltdb.InMemDoltDB, "test") 46 return dEnv 47 } 48 49 func TestGetDotDotRevisions(t *testing.T) { 50 env := createUninitializedEnv() 51 err := env.InitRepo(context.Background(), types.Format_LD_1, "Bill Billerson", "bill@billerson.com") 52 require.NoError(t, err) 53 54 cs, err := doltdb.NewCommitSpec("master") 55 require.NoError(t, err) 56 commit, err := env.DoltDB.Resolve(context.Background(), cs, nil) 57 require.NoError(t, err) 58 59 rv, err := commit.GetRootValue() 60 require.NoError(t, err) 61 rvh, err := env.DoltDB.WriteRootValue(context.Background(), rv) 62 require.NoError(t, err) 63 64 // Create 5 commits on master. 65 masterCommits := make([]*doltdb.Commit, 6) 66 masterCommits[0] = commit 67 for i := 1; i < 6; i++ { 68 masterCommits[i] = mustCreateCommit(t, env.DoltDB, "master", rvh, masterCommits[i-1]) 69 } 70 71 // Create a feature branch. 72 bref := ref.NewBranchRef("feature") 73 err = env.DoltDB.NewBranchAtCommit(context.Background(), bref, masterCommits[5]) 74 require.NoError(t, err) 75 76 // Create 3 commits on feature branch. 77 featureCommits := []*doltdb.Commit{} 78 featureCommits = append(featureCommits, masterCommits[5]) 79 for i := 1; i < 4; i++ { 80 featureCommits = append(featureCommits, mustCreateCommit(t, env.DoltDB, "feature", rvh, featureCommits[i-1])) 81 } 82 83 // Create 1 commit on master. 84 masterCommits = append(masterCommits, mustCreateCommit(t, env.DoltDB, "master", rvh, masterCommits[5])) 85 86 // Merge master to feature branch. 87 featureCommits = append(featureCommits, mustCreateCommit(t, env.DoltDB, "feature", rvh, featureCommits[3], masterCommits[6])) 88 89 // Create 3 commits on feature branch. 90 for i := 5; i < 8; i++ { 91 featureCommits = append(featureCommits, mustCreateCommit(t, env.DoltDB, "feature", rvh, featureCommits[i-1])) 92 } 93 94 // Create 3 commits on master. 95 for i := 7; i < 10; i++ { 96 masterCommits = append(masterCommits, mustCreateCommit(t, env.DoltDB, "master", rvh, masterCommits[i-1])) 97 } 98 99 // Branches look like this: 100 // 101 // feature: *--*--*--*--*--*--* 102 // / / 103 // master: --*--*--*--*--*--------*--*--*--* 104 105 featureHash := mustGetHash(t, featureCommits[7]) 106 masterHash := mustGetHash(t, masterCommits[6]) 107 featurePreMergeHash := mustGetHash(t, featureCommits[3]) 108 109 res, err := GetDotDotRevisions(context.Background(), env.DoltDB, featureHash, env.DoltDB, masterHash, 100) 110 require.NoError(t, err) 111 assert.Len(t, res, 7) 112 assertEqualHashes(t, featureCommits[7], res[0]) 113 assertEqualHashes(t, featureCommits[6], res[1]) 114 assertEqualHashes(t, featureCommits[5], res[2]) 115 assertEqualHashes(t, featureCommits[4], res[3]) 116 assertEqualHashes(t, featureCommits[3], res[4]) 117 assertEqualHashes(t, featureCommits[2], res[5]) 118 assertEqualHashes(t, featureCommits[1], res[6]) 119 120 res, err = GetDotDotRevisions(context.Background(), env.DoltDB, masterHash, env.DoltDB, featureHash, 100) 121 require.NoError(t, err) 122 assert.Len(t, res, 0) 123 124 res, err = GetDotDotRevisions(context.Background(), env.DoltDB, featureHash, env.DoltDB, masterHash, 3) 125 require.NoError(t, err) 126 assert.Len(t, res, 3) 127 assertEqualHashes(t, featureCommits[7], res[0]) 128 assertEqualHashes(t, featureCommits[6], res[1]) 129 assertEqualHashes(t, featureCommits[5], res[2]) 130 131 res, err = GetDotDotRevisions(context.Background(), env.DoltDB, featurePreMergeHash, env.DoltDB, masterHash, 3) 132 require.NoError(t, err) 133 assert.Len(t, res, 3) 134 assertEqualHashes(t, featureCommits[3], res[0]) 135 assertEqualHashes(t, featureCommits[2], res[1]) 136 assertEqualHashes(t, featureCommits[1], res[2]) 137 138 res, err = GetDotDotRevisions(context.Background(), env.DoltDB, featurePreMergeHash, env.DoltDB, masterHash, 3) 139 require.NoError(t, err) 140 assert.Len(t, res, 3) 141 assertEqualHashes(t, featureCommits[3], res[0]) 142 assertEqualHashes(t, featureCommits[2], res[1]) 143 assertEqualHashes(t, featureCommits[1], res[2]) 144 145 // Create a similar branch to "feature" on a forked repository and GetDotDotRevisions using that as well. 146 forkEnv := mustForkDB(t, env.DoltDB, "feature", featureCommits[4]) 147 148 // Create 3 commits on feature branch. 149 for i := 5; i < 8; i++ { 150 featureCommits[i] = mustCreateCommit(t, forkEnv.DoltDB, "feature", rvh, featureCommits[i-1]) 151 } 152 153 featureHash = mustGetHash(t, featureCommits[7]) 154 masterHash = mustGetHash(t, masterCommits[6]) 155 featurePreMergeHash = mustGetHash(t, featureCommits[3]) 156 157 res, err = GetDotDotRevisions(context.Background(), env.DoltDB, featureHash, env.DoltDB, masterHash, 100) 158 require.Error(t, err) 159 res, err = GetDotDotRevisions(context.Background(), forkEnv.DoltDB, featureHash, env.DoltDB, masterHash, 100) 160 require.NoError(t, err) 161 assert.Len(t, res, 7) 162 assertEqualHashes(t, featureCommits[7], res[0]) 163 assertEqualHashes(t, featureCommits[6], res[1]) 164 assertEqualHashes(t, featureCommits[5], res[2]) 165 assertEqualHashes(t, featureCommits[4], res[3]) 166 assertEqualHashes(t, featureCommits[3], res[4]) 167 assertEqualHashes(t, featureCommits[2], res[5]) 168 assertEqualHashes(t, featureCommits[1], res[6]) 169 170 res, err = GetDotDotRevisions(context.Background(), env.DoltDB, masterHash, env.DoltDB, featureHash, 100) 171 require.Error(t, err) 172 res, err = GetDotDotRevisions(context.Background(), env.DoltDB, masterHash, forkEnv.DoltDB, featureHash, 100) 173 require.NoError(t, err) 174 assert.Len(t, res, 0) 175 176 res, err = GetDotDotRevisions(context.Background(), forkEnv.DoltDB, featureHash, env.DoltDB, masterHash, 3) 177 require.NoError(t, err) 178 assert.Len(t, res, 3) 179 assertEqualHashes(t, featureCommits[7], res[0]) 180 assertEqualHashes(t, featureCommits[6], res[1]) 181 assertEqualHashes(t, featureCommits[5], res[2]) 182 183 res, err = GetDotDotRevisions(context.Background(), env.DoltDB, featurePreMergeHash, env.DoltDB, masterHash, 3) 184 require.NoError(t, err) 185 assert.Len(t, res, 3) 186 assertEqualHashes(t, featureCommits[3], res[0]) 187 assertEqualHashes(t, featureCommits[2], res[1]) 188 assertEqualHashes(t, featureCommits[1], res[2]) 189 190 res, err = GetDotDotRevisions(context.Background(), forkEnv.DoltDB, featurePreMergeHash, env.DoltDB, masterHash, 3) 191 require.NoError(t, err) 192 assert.Len(t, res, 3) 193 assertEqualHashes(t, featureCommits[3], res[0]) 194 assertEqualHashes(t, featureCommits[2], res[1]) 195 assertEqualHashes(t, featureCommits[1], res[2]) 196 } 197 198 func assertEqualHashes(t *testing.T, lc, rc *doltdb.Commit) { 199 assert.Equal(t, mustGetHash(t, lc), mustGetHash(t, rc)) 200 } 201 202 func mustCreateCommit(t *testing.T, ddb *doltdb.DoltDB, bn string, rvh hash.Hash, parents ...*doltdb.Commit) *doltdb.Commit { 203 cm, err := doltdb.NewCommitMeta("Bill Billerson", "bill@billerson.com", "A New Commit.") 204 require.NoError(t, err) 205 pcs := make([]*doltdb.CommitSpec, 0, len(parents)) 206 for _, parent := range parents { 207 cs, err := doltdb.NewCommitSpec(mustGetHash(t, parent).String()) 208 require.NoError(t, err) 209 pcs = append(pcs, cs) 210 } 211 bref := ref.NewBranchRef(bn) 212 commit, err := ddb.CommitWithParentSpecs(context.Background(), rvh, bref, pcs, cm) 213 require.NoError(t, err) 214 return commit 215 } 216 217 func mustForkDB(t *testing.T, fromDB *doltdb.DoltDB, bn string, cm *doltdb.Commit) *env.DoltEnv { 218 stref, err := cm.GetStRef() 219 require.NoError(t, err) 220 forkEnv := createUninitializedEnv() 221 err = forkEnv.InitRepo(context.Background(), types.Format_LD_1, "Bill Billerson", "bill@billerson.com") 222 require.NoError(t, err) 223 p1 := make(chan datas.PullProgress) 224 p2 := make(chan datas.PullerEvent) 225 go func() { 226 for range p1 { 227 } 228 }() 229 go func() { 230 for range p2 { 231 } 232 }() 233 err = forkEnv.DoltDB.PullChunks(context.Background(), "", fromDB, stref, p1, p2) 234 require.NoError(t, err) 235 err = forkEnv.DoltDB.SetHead(context.Background(), ref.NewBranchRef(bn), stref) 236 require.NoError(t, err) 237 return forkEnv 238 } 239 240 func mustGetHash(t *testing.T, c *doltdb.Commit) hash.Hash { 241 h, err := c.HashOf() 242 require.NoError(t, err) 243 return h 244 }