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  }