github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/graveler/testutil/fakes.go (about)

     1  package testutil
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"fmt"
     7  	"sort"
     8  	"time"
     9  
    10  	"github.com/treeverse/lakefs/pkg/graveler"
    11  	"github.com/treeverse/lakefs/pkg/graveler/committed"
    12  )
    13  
    14  const DefaultBranchID = graveler.BranchID("main")
    15  
    16  type AppliedData struct {
    17  	Values      graveler.ValueIterator
    18  	MetaRangeID graveler.MetaRangeID
    19  }
    20  
    21  type CommittedFake struct {
    22  	ValuesByKey   map[string]*graveler.Value
    23  	ValueIterator graveler.ValueIterator
    24  	Values        map[string]graveler.ValueIterator
    25  	DiffIterator  graveler.DiffIterator
    26  	Err           error
    27  	MetaRangeID   graveler.MetaRangeID
    28  	RangeInfo     graveler.RangeInfo
    29  	DiffSummary   graveler.DiffSummary
    30  	AppliedData   AppliedData
    31  }
    32  
    33  func (c *CommittedFake) GetRangeIDByKey(_ context.Context, _ graveler.StorageNamespace, _ graveler.MetaRangeID, _ graveler.Key) (graveler.RangeID, error) {
    34  	panic("implement me")
    35  }
    36  
    37  type MetaRangeFake struct {
    38  	id graveler.MetaRangeID
    39  }
    40  
    41  func (t *MetaRangeFake) ID() graveler.MetaRangeID {
    42  	return t.id
    43  }
    44  
    45  func (c *CommittedFake) Exists(context.Context, graveler.StorageNamespace, graveler.MetaRangeID) (bool, error) {
    46  	if c.Err != nil {
    47  		return false, c.Err
    48  	}
    49  	return true, nil
    50  }
    51  
    52  func (c *CommittedFake) Get(_ context.Context, _ graveler.StorageNamespace, _ graveler.MetaRangeID, key graveler.Key) (*graveler.Value, error) {
    53  	if c.Err != nil {
    54  		return nil, c.Err
    55  	}
    56  	return c.ValuesByKey[string(key)], nil
    57  }
    58  
    59  func (c *CommittedFake) List(_ context.Context, _ graveler.StorageNamespace, mr graveler.MetaRangeID) (graveler.ValueIterator, error) {
    60  	if c.Err != nil {
    61  		return nil, c.Err
    62  	}
    63  	if it, ok := c.Values[mr.String()]; ok {
    64  		return it, nil
    65  	}
    66  	return c.ValueIterator, nil
    67  }
    68  
    69  func (c *CommittedFake) Diff(context.Context, graveler.StorageNamespace, graveler.MetaRangeID, graveler.MetaRangeID) (graveler.DiffIterator, error) {
    70  	if c.Err != nil {
    71  		return nil, c.Err
    72  	}
    73  	return c.DiffIterator, nil
    74  }
    75  
    76  func (c *CommittedFake) Compare(context.Context, graveler.StorageNamespace, graveler.MetaRangeID, graveler.MetaRangeID, graveler.MetaRangeID) (graveler.DiffIterator, error) {
    77  	if c.Err != nil {
    78  		return nil, c.Err
    79  	}
    80  	return c.DiffIterator, nil
    81  }
    82  
    83  func (c *CommittedFake) Merge(_ context.Context, _ graveler.StorageNamespace, _, _, _ graveler.MetaRangeID, _ graveler.MergeStrategy, _ ...graveler.SetOptionsFunc) (graveler.MetaRangeID, error) {
    84  	if c.Err != nil {
    85  		return "", c.Err
    86  	}
    87  	return c.MetaRangeID, nil
    88  }
    89  
    90  func (c *CommittedFake) Import(_ context.Context, _ graveler.StorageNamespace, _, _ graveler.MetaRangeID, _ []graveler.Prefix, _ ...graveler.SetOptionsFunc) (graveler.MetaRangeID, error) {
    91  	if c.Err != nil {
    92  		return "", c.Err
    93  	}
    94  	return c.MetaRangeID, nil
    95  }
    96  
    97  func (c *CommittedFake) Commit(_ context.Context, _ graveler.StorageNamespace, baseMetaRangeID graveler.MetaRangeID, changes graveler.ValueIterator, _ bool, _ ...graveler.SetOptionsFunc) (graveler.MetaRangeID, graveler.DiffSummary, error) {
    98  	if c.Err != nil {
    99  		return "", graveler.DiffSummary{}, c.Err
   100  	}
   101  	c.AppliedData.Values = changes
   102  	c.AppliedData.MetaRangeID = baseMetaRangeID
   103  	return c.MetaRangeID, c.DiffSummary, nil
   104  }
   105  
   106  func (c *CommittedFake) WriteMetaRangeByIterator(context.Context, graveler.StorageNamespace, graveler.ValueIterator, graveler.Metadata) (*graveler.MetaRangeID, error) {
   107  	if c.Err != nil {
   108  		return nil, c.Err
   109  	}
   110  	return &c.MetaRangeID, nil
   111  }
   112  
   113  func (c *CommittedFake) WriteRange(context.Context, graveler.StorageNamespace, graveler.ValueIterator) (*graveler.RangeInfo, error) {
   114  	return &c.RangeInfo, nil
   115  }
   116  
   117  func (c *CommittedFake) WriteMetaRange(context.Context, graveler.StorageNamespace, []*graveler.RangeInfo) (*graveler.MetaRangeInfo, error) {
   118  	return &graveler.MetaRangeInfo{ID: c.MetaRangeID}, nil
   119  }
   120  
   121  func (c *CommittedFake) GetMetaRange(_ context.Context, _ graveler.StorageNamespace, metaRangeID graveler.MetaRangeID) (graveler.MetaRangeAddress, error) {
   122  	return graveler.MetaRangeAddress(fmt.Sprintf("fake://prefix/%s(metarange)", metaRangeID)), nil
   123  }
   124  
   125  func (c *CommittedFake) GetRange(_ context.Context, _ graveler.StorageNamespace, rangeID graveler.RangeID) (graveler.RangeAddress, error) {
   126  	return graveler.RangeAddress(fmt.Sprintf("fake://prefix/%s(range)", rangeID)), nil
   127  }
   128  
   129  // Backwards compatibility for test pre-KV
   130  const defaultKey = "key"
   131  
   132  type StagingFake struct {
   133  	Err                error
   134  	DropErr            error // specific error for drop call
   135  	Value              *graveler.Value
   136  	ValueIterator      graveler.ValueIterator
   137  	Values             map[string]map[string]*graveler.Value
   138  	LastSetValueRecord *graveler.ValueRecord
   139  	LastRemovedKey     graveler.Key
   140  	DropCalled         bool
   141  	SetErr             error
   142  	UpdateErr          error
   143  }
   144  
   145  func (s *StagingFake) DropAsync(ctx context.Context, st graveler.StagingToken) error {
   146  	return s.Drop(ctx, st)
   147  }
   148  
   149  func (s *StagingFake) DropByPrefix(context.Context, graveler.StagingToken, graveler.Key) error {
   150  	return nil
   151  }
   152  
   153  func (s *StagingFake) Drop(context.Context, graveler.StagingToken) error {
   154  	s.DropCalled = true
   155  	if s.DropErr != nil {
   156  		return s.DropErr
   157  	}
   158  	return nil
   159  }
   160  
   161  func (s *StagingFake) Get(_ context.Context, st graveler.StagingToken, key graveler.Key) (*graveler.Value, error) {
   162  	if s.Err != nil {
   163  		return nil, s.Err
   164  	}
   165  	if key.String() == defaultKey {
   166  		return s.Value, nil
   167  	}
   168  	if v, ok := s.Values[st.String()][key.String()]; ok {
   169  		return v, nil
   170  	}
   171  	return nil, graveler.ErrNotFound
   172  }
   173  
   174  func (s *StagingFake) Set(_ context.Context, _ graveler.StagingToken, key graveler.Key, value *graveler.Value, _ bool) error {
   175  	if s.SetErr != nil {
   176  		return s.SetErr
   177  	}
   178  	s.LastSetValueRecord = &graveler.ValueRecord{
   179  		Key:   key,
   180  		Value: value,
   181  	}
   182  	return nil
   183  }
   184  
   185  func (s *StagingFake) Update(_ context.Context, st graveler.StagingToken, key graveler.Key, updateFunc graveler.ValueUpdateFunc) error {
   186  	if s.UpdateErr != nil {
   187  		return s.UpdateErr
   188  	}
   189  	v := s.Values[st.String()][key.String()]
   190  
   191  	val, err := updateFunc(v)
   192  	if err != nil {
   193  		return err
   194  	}
   195  	s.LastSetValueRecord = &graveler.ValueRecord{
   196  		Key:   key,
   197  		Value: val,
   198  	}
   199  	return nil
   200  }
   201  
   202  func (s *StagingFake) DropKey(_ context.Context, _ graveler.StagingToken, key graveler.Key) error {
   203  	if s.Err != nil {
   204  		return s.Err
   205  	}
   206  	s.LastRemovedKey = key
   207  	return nil
   208  }
   209  
   210  func (s *StagingFake) List(_ context.Context, st graveler.StagingToken, _ int) graveler.ValueIterator {
   211  	if s.Values != nil && s.Values[st.String()] != nil {
   212  		keys := make([]string, 0)
   213  		for k := range s.Values[st.String()] {
   214  			keys = append(keys, k)
   215  		}
   216  		sort.Strings(keys)
   217  		values := make([]graveler.ValueRecord, 0)
   218  		for _, k := range keys {
   219  			values = append(values, graveler.ValueRecord{
   220  				Key:   graveler.Key(k),
   221  				Value: s.Values[st.String()][k],
   222  			})
   223  		}
   224  		return NewValueIteratorFake(values)
   225  	}
   226  	return s.ValueIterator
   227  }
   228  
   229  type AddedCommitData struct {
   230  	Committer   string
   231  	Message     string
   232  	MetaRangeID graveler.MetaRangeID
   233  	Parents     graveler.CommitParents
   234  	Metadata    graveler.Metadata
   235  }
   236  
   237  type RefsFake struct {
   238  	ListRepositoriesRes graveler.RepositoryIterator
   239  	ListBranchesRes     graveler.BranchIterator
   240  	ListCommitsRes      graveler.CommitIterator
   241  	Refs                map[graveler.Ref]*graveler.ResolvedRef
   242  	ListTagsRes         graveler.TagIterator
   243  	CommitIter          graveler.CommitIterator
   244  	RefType             graveler.ReferenceType
   245  	Branch              *graveler.Branch
   246  	TagCommitID         *graveler.CommitID
   247  	Err                 error
   248  	CommitErr           error
   249  	UpdateErr           error
   250  	AddedCommit         AddedCommitData
   251  	CommitID            graveler.CommitID
   252  	Commits             map[graveler.CommitID]*graveler.Commit
   253  	StagingToken        graveler.StagingToken
   254  	SealedTokens        []graveler.StagingToken
   255  }
   256  
   257  func (m *RefsFake) CreateBranch(_ context.Context, _ *graveler.RepositoryRecord, _ graveler.BranchID, branch graveler.Branch) error {
   258  	if m.Branch != nil {
   259  		return graveler.ErrBranchExists
   260  	}
   261  	m.Branch = &graveler.Branch{
   262  		CommitID:     branch.CommitID,
   263  		StagingToken: branch.StagingToken,
   264  	}
   265  	return nil
   266  }
   267  
   268  func (m *RefsFake) FillGenerations(_ context.Context, _ *graveler.RepositoryRecord) error {
   269  	panic("implement me")
   270  }
   271  
   272  func (m *RefsFake) CreateBareRepository(_ context.Context, _ graveler.RepositoryID, _ graveler.Repository) (*graveler.RepositoryRecord, error) {
   273  	panic("implement me")
   274  }
   275  
   276  func (m *RefsFake) ListCommits(_ context.Context, _ *graveler.RepositoryRecord) (graveler.CommitIterator, error) {
   277  	return m.ListCommitsRes, nil
   278  }
   279  
   280  func (m *RefsFake) GCCommitIterator(_ context.Context, _ *graveler.RepositoryRecord) (graveler.CommitIterator, error) {
   281  	return nil, nil
   282  }
   283  
   284  func (m *RefsFake) ParseRef(ref graveler.Ref) (graveler.RawRef, error) {
   285  	// fake so we use the base ref to capture the ref for resolve lookup
   286  	return graveler.RawRef{
   287  		BaseRef: string(ref),
   288  	}, nil
   289  }
   290  
   291  func (m *RefsFake) ResolveRawRef(_ context.Context, _ *graveler.RepositoryRecord, rawRef graveler.RawRef) (*graveler.ResolvedRef, error) {
   292  	if m.Refs != nil {
   293  		ref := graveler.Ref(rawRef.BaseRef)
   294  		if res, ok := m.Refs[ref]; ok {
   295  			return res, nil
   296  		}
   297  		if m.Err != nil {
   298  			return nil, m.Err
   299  		}
   300  	}
   301  
   302  	var branch graveler.BranchID
   303  	var stagingToken graveler.StagingToken
   304  	var sealedTokens []graveler.StagingToken
   305  	if m.RefType == graveler.ReferenceTypeBranch {
   306  		branch = DefaultBranchID
   307  		stagingToken = m.StagingToken
   308  		sealedTokens = m.SealedTokens
   309  	}
   310  
   311  	return &graveler.ResolvedRef{
   312  		Type: m.RefType,
   313  		BranchRecord: graveler.BranchRecord{
   314  			BranchID: branch,
   315  			Branch: &graveler.Branch{
   316  				CommitID:     m.CommitID,
   317  				StagingToken: stagingToken,
   318  				SealedTokens: sealedTokens,
   319  			},
   320  		},
   321  	}, nil
   322  }
   323  
   324  func (m *RefsFake) GetRepository(_ context.Context, repositoryID graveler.RepositoryID) (*graveler.RepositoryRecord, error) {
   325  	return &graveler.RepositoryRecord{
   326  		RepositoryID: repositoryID,
   327  	}, nil
   328  }
   329  
   330  func (m *RefsFake) CreateRepository(_ context.Context, repositoryID graveler.RepositoryID, repository graveler.Repository) (*graveler.RepositoryRecord, error) {
   331  	return &graveler.RepositoryRecord{
   332  		RepositoryID: repositoryID,
   333  		Repository:   &repository,
   334  	}, nil
   335  }
   336  
   337  func (m *RefsFake) ListRepositories(context.Context) (graveler.RepositoryIterator, error) {
   338  	return m.ListRepositoriesRes, nil
   339  }
   340  
   341  func (m *RefsFake) DeleteRepository(context.Context, graveler.RepositoryID, ...graveler.SetOptionsFunc) error {
   342  	return nil
   343  }
   344  
   345  func (m *RefsFake) GetBranch(context.Context, *graveler.RepositoryRecord, graveler.BranchID) (*graveler.Branch, error) {
   346  	return m.Branch, m.Err
   347  }
   348  
   349  func (m *RefsFake) SetBranch(context.Context, *graveler.RepositoryRecord, graveler.BranchID, graveler.Branch) error {
   350  	return nil
   351  }
   352  
   353  func (m *RefsFake) BranchUpdate(_ context.Context, _ *graveler.RepositoryRecord, _ graveler.BranchID, update graveler.BranchUpdateFunc) error {
   354  	_, err := update(m.Branch)
   355  	if m.UpdateErr != nil {
   356  		return m.UpdateErr
   357  	}
   358  	return err
   359  }
   360  
   361  func (m *RefsFake) DeleteBranch(context.Context, *graveler.RepositoryRecord, graveler.BranchID) error {
   362  	return nil
   363  }
   364  
   365  func (m *RefsFake) ListBranches(context.Context, *graveler.RepositoryRecord) (graveler.BranchIterator, error) {
   366  	return m.ListBranchesRes, nil
   367  }
   368  
   369  func (m *RefsFake) GCBranchIterator(context.Context, *graveler.RepositoryRecord) (graveler.BranchIterator, error) {
   370  	return m.ListBranchesRes, nil
   371  }
   372  
   373  func (m *RefsFake) GetTag(context.Context, *graveler.RepositoryRecord, graveler.TagID) (*graveler.CommitID, error) {
   374  	return m.TagCommitID, m.Err
   375  }
   376  
   377  func (m *RefsFake) CreateTag(context.Context, *graveler.RepositoryRecord, graveler.TagID, graveler.CommitID) error {
   378  	return nil
   379  }
   380  
   381  func (m *RefsFake) DeleteTag(context.Context, *graveler.RepositoryRecord, graveler.TagID) error {
   382  	return nil
   383  }
   384  
   385  func (m *RefsFake) ListTags(context.Context, *graveler.RepositoryRecord) (graveler.TagIterator, error) {
   386  	return m.ListTagsRes, nil
   387  }
   388  
   389  func (m *RefsFake) GetCommit(_ context.Context, _ *graveler.RepositoryRecord, id graveler.CommitID) (*graveler.Commit, error) {
   390  	if val, ok := m.Commits[id]; ok {
   391  		return val, nil
   392  	}
   393  
   394  	return nil, graveler.ErrCommitNotFound
   395  }
   396  
   397  func (m *RefsFake) GetCommitByPrefix(_ context.Context, _ *graveler.RepositoryRecord, _ graveler.CommitID) (*graveler.Commit, error) {
   398  	return &graveler.Commit{}, nil
   399  }
   400  
   401  func (m *RefsFake) AddCommit(_ context.Context, _ *graveler.RepositoryRecord, commit graveler.Commit) (graveler.CommitID, error) {
   402  	if m.CommitErr != nil {
   403  		return "", m.CommitErr
   404  	}
   405  	m.AddedCommit = AddedCommitData{
   406  		Committer:   commit.Committer,
   407  		Message:     commit.Message,
   408  		MetaRangeID: commit.MetaRangeID,
   409  		Parents:     commit.Parents,
   410  		Metadata:    commit.Metadata,
   411  	}
   412  	return m.CommitID, nil
   413  }
   414  
   415  func (m *RefsFake) RemoveCommit(_ context.Context, _ *graveler.RepositoryRecord, commitID graveler.CommitID) error {
   416  	delete(m.Commits, commitID)
   417  	return nil
   418  }
   419  
   420  func (m *RefsFake) FindMergeBase(context.Context, *graveler.RepositoryRecord, ...graveler.CommitID) (*graveler.Commit, error) {
   421  	return &graveler.Commit{}, nil
   422  }
   423  
   424  func (m *RefsFake) Log(context.Context, *graveler.RepositoryRecord, graveler.CommitID, bool, *time.Time) (graveler.CommitIterator, error) {
   425  	return m.CommitIter, nil
   426  }
   427  
   428  func (m *RefsFake) VerifyLinkAddress(_ context.Context, _ *graveler.RepositoryRecord, _ string) error {
   429  	return m.Err
   430  }
   431  
   432  func (m *RefsFake) DeleteExpiredImports(context.Context, *graveler.RepositoryRecord) error {
   433  	return nil
   434  }
   435  
   436  type diffIter struct {
   437  	current int
   438  	records []graveler.Diff
   439  	err     error
   440  }
   441  
   442  func NewDiffIter(records []graveler.Diff) *diffIter {
   443  	return &diffIter{records: records, current: -1}
   444  }
   445  
   446  func (r *diffIter) Next() bool {
   447  	r.current++
   448  	return r.current < len(r.records)
   449  }
   450  
   451  func (r *diffIter) SeekGE(id graveler.Key) {
   452  	i := sort.Search(len(r.records), func(i int) bool {
   453  		return bytes.Compare(r.records[i].Key, id) >= 0
   454  	})
   455  	r.current = i - 1
   456  }
   457  
   458  func (r *diffIter) Value() *graveler.Diff {
   459  	if r.current < 0 || r.current >= len(r.records) {
   460  		return nil
   461  	}
   462  	return &r.records[r.current]
   463  }
   464  
   465  func (r *diffIter) Err() error {
   466  	return r.err
   467  }
   468  
   469  func (r *diffIter) Close() {}
   470  
   471  type valueIteratorFake struct {
   472  	current int
   473  	records []graveler.ValueRecord
   474  	err     error
   475  }
   476  
   477  func NewValueIteratorFake(records []graveler.ValueRecord) graveler.ValueIterator {
   478  	return &valueIteratorFake{records: records, current: -1}
   479  }
   480  
   481  func (r *valueIteratorFake) Next() bool {
   482  	r.current++
   483  	return r.current < len(r.records)
   484  }
   485  
   486  func (r *valueIteratorFake) SeekGE(id graveler.Key) {
   487  	r.current = len(r.records)
   488  	for i, record := range r.records {
   489  		if bytes.Compare(record.Key, id) >= 0 {
   490  			r.current = i - 1
   491  			return
   492  		}
   493  	}
   494  }
   495  
   496  func (r *valueIteratorFake) Value() *graveler.ValueRecord {
   497  	if r.current < 0 || r.current >= len(r.records) {
   498  		return nil
   499  	}
   500  	return &r.records[r.current]
   501  }
   502  
   503  func (r *valueIteratorFake) Err() error {
   504  	return r.err
   505  }
   506  
   507  func (r *valueIteratorFake) Close() {}
   508  
   509  type committedValueIteratorFake struct {
   510  	current int
   511  	records []committed.Record
   512  	err     error
   513  }
   514  
   515  func NewCommittedValueIteratorFake(records []committed.Record) *committedValueIteratorFake {
   516  	return &committedValueIteratorFake{records: records, current: -1}
   517  }
   518  
   519  func (r *committedValueIteratorFake) Next() bool {
   520  	r.current++
   521  	return r.current < len(r.records)
   522  }
   523  
   524  func (r *committedValueIteratorFake) SeekGE(id committed.Key) {
   525  	i := sort.Search(len(r.records), func(i int) bool {
   526  		return bytes.Compare(r.records[i].Key, id) >= 0
   527  	})
   528  	r.current = i - 1
   529  }
   530  
   531  func (r *committedValueIteratorFake) Value() *committed.Record {
   532  	if r.current < 0 || r.current >= len(r.records) {
   533  		return nil
   534  	}
   535  	return &r.records[r.current]
   536  }
   537  
   538  func (r *committedValueIteratorFake) Err() error {
   539  	return r.err
   540  }
   541  
   542  func (r *committedValueIteratorFake) Close() {}
   543  
   544  type RV struct {
   545  	R *committed.Range
   546  	V *graveler.ValueRecord
   547  }
   548  
   549  type FakeIterator struct {
   550  	RV           []RV
   551  	idx          int
   552  	rangeIdx     int
   553  	err          error
   554  	closed       bool
   555  	readsByRange []int
   556  }
   557  
   558  func NewFakeIterator() *FakeIterator {
   559  	// Start with an empty record so the first `Next()` can skip it.
   560  	return &FakeIterator{RV: make([]RV, 1), idx: 0, rangeIdx: -1}
   561  }
   562  
   563  // ReadsByRange returns the number of Next operations performed inside each range
   564  func (i *FakeIterator) ReadsByRange() []int {
   565  	return i.readsByRange
   566  }
   567  
   568  func (i *FakeIterator) nextKey() []byte {
   569  	if len(i.RV) <= i.idx+1 {
   570  		return nil
   571  	}
   572  	if i.RV[i.idx+1].V == nil {
   573  		return i.RV[i.idx+1].R.MinKey
   574  	}
   575  	return i.RV[i.idx+1].V.Key
   576  }
   577  
   578  func (i *FakeIterator) SetErr(err error) {
   579  	i.err = err
   580  }
   581  
   582  func (i *FakeIterator) AddRange(p *committed.Range) *FakeIterator {
   583  	i.RV = append(i.RV, RV{R: p})
   584  	i.readsByRange = append(i.readsByRange, 0)
   585  	return i
   586  }
   587  
   588  func (i *FakeIterator) AddValueRecords(vs ...*graveler.ValueRecord) *FakeIterator {
   589  	if len(i.RV) == 0 {
   590  		panic(fmt.Sprintf("cannot add ValueRecords %+v with no range", vs))
   591  	}
   592  	rng := i.RV[len(i.RV)-1].R
   593  	for _, v := range vs {
   594  		i.RV = append(i.RV, RV{R: rng, V: v})
   595  	}
   596  	return i
   597  }
   598  
   599  func (i *FakeIterator) Next() bool {
   600  	if i.err != nil || i.closed {
   601  		return false
   602  	}
   603  	if len(i.RV) <= i.idx+1 {
   604  		return false
   605  	}
   606  	i.idx++
   607  	if i.RV[i.idx].V == nil {
   608  		i.rangeIdx++
   609  	} else {
   610  		i.readsByRange[i.rangeIdx]++
   611  	}
   612  	return true
   613  }
   614  
   615  func (i *FakeIterator) NextRange() bool {
   616  	for {
   617  		if len(i.RV) <= i.idx+1 {
   618  			return false
   619  		}
   620  		i.idx++
   621  		if i.RV[i.idx].V == nil {
   622  			i.rangeIdx++
   623  			return true
   624  		}
   625  	}
   626  }
   627  
   628  func (i *FakeIterator) Value() (*graveler.ValueRecord, *committed.Range) {
   629  	if i.closed {
   630  		return nil, nil
   631  	}
   632  	return i.RV[i.idx].V, i.RV[i.idx].R
   633  }
   634  
   635  func (i *FakeIterator) SeekGE(id graveler.Key) {
   636  	i.idx = 0
   637  	i.rangeIdx = -1
   638  	for {
   639  		nextKey := i.nextKey()
   640  		if nextKey == nil || bytes.Compare(nextKey, id) >= 0 {
   641  			return
   642  		}
   643  		if !i.Next() {
   644  			return
   645  		}
   646  	}
   647  }
   648  
   649  func (i *FakeIterator) Err() error {
   650  	return i.err
   651  }
   652  
   653  func (i *FakeIterator) Close() {
   654  	i.closed = true
   655  }
   656  
   657  type DRV struct {
   658  	R *committed.RangeDiff
   659  	V *graveler.Diff
   660  }
   661  
   662  type FakeDiffIterator struct {
   663  	DRV          []DRV
   664  	idx          int
   665  	rangeIdx     int
   666  	err          error
   667  	closed       bool
   668  	readsByRange []int
   669  }
   670  
   671  // ReadsByRange returns the number of Next operations performed inside each range
   672  func (i *FakeDiffIterator) ReadsByRange() []int {
   673  	return i.readsByRange
   674  }
   675  
   676  func (i *FakeDiffIterator) nextKey() []byte {
   677  	for j := 1; len(i.DRV) > i.idx+j; j++ {
   678  		if i.DRV[i.idx+j].V == nil {
   679  			if i.DRV[i.idx+j].R == nil {
   680  				continue // in case we added an empty range header
   681  			}
   682  			return i.DRV[i.idx+j].R.Range.MinKey
   683  		}
   684  		return i.DRV[i.idx+j].V.Key
   685  	}
   686  	return nil
   687  }
   688  
   689  func (i *FakeDiffIterator) SetErr(err error) {
   690  	i.err = err
   691  }
   692  
   693  func (i *FakeDiffIterator) AddRange(p *committed.RangeDiff) *FakeDiffIterator {
   694  	i.DRV = append(i.DRV, DRV{R: p})
   695  	i.readsByRange = append(i.readsByRange, 0)
   696  	return i
   697  }
   698  
   699  func (i *FakeDiffIterator) AddValueRecords(vs ...*graveler.Diff) *FakeDiffIterator {
   700  	if len(i.DRV) == 0 {
   701  		panic(fmt.Sprintf("cannot add ValueRecords %+v with no range", vs))
   702  	}
   703  	rng := i.DRV[len(i.DRV)-1].R
   704  	for _, v := range vs {
   705  		i.DRV = append(i.DRV, DRV{R: rng, V: v})
   706  	}
   707  	return i
   708  }
   709  
   710  func (i *FakeDiffIterator) Next() bool {
   711  	if i.err != nil || i.closed {
   712  		return false
   713  	}
   714  	if len(i.DRV) <= i.idx+1 {
   715  		return false
   716  	}
   717  	i.idx++
   718  	if i.DRV[i.idx].V == nil {
   719  		i.rangeIdx++
   720  		if i.DRV[i.idx].R == nil {
   721  			return i.Next() // in case we added an empty range header
   722  		}
   723  	} else if i.DRV[i.idx].R != nil {
   724  		i.readsByRange[i.rangeIdx]++
   725  	}
   726  	return true
   727  }
   728  
   729  func (i *FakeDiffIterator) NextRange() bool {
   730  	for {
   731  		if len(i.DRV) <= i.idx+1 {
   732  			return false
   733  		}
   734  		i.idx++
   735  		if i.DRV[i.idx].V == nil {
   736  			i.rangeIdx++
   737  			if i.DRV[i.idx].R == nil {
   738  				return i.Next() // in case we added an empty range header
   739  			}
   740  			return true
   741  		}
   742  	}
   743  }
   744  
   745  func (i *FakeDiffIterator) Value() (*graveler.Diff, *committed.RangeDiff) {
   746  	if i.closed {
   747  		return nil, nil
   748  	}
   749  	return i.DRV[i.idx].V, i.DRV[i.idx].R
   750  }
   751  
   752  func (i *FakeDiffIterator) SeekGE(id graveler.Key) {
   753  	i.idx = 0
   754  	i.rangeIdx = -1
   755  	for {
   756  		nextKey := i.nextKey()
   757  		if nextKey == nil || bytes.Compare(nextKey, id) >= 0 {
   758  			return
   759  		}
   760  		if !i.Next() {
   761  			return
   762  		}
   763  	}
   764  }
   765  
   766  func (i *FakeDiffIterator) Err() error {
   767  	return i.err
   768  }
   769  
   770  func (i *FakeDiffIterator) Close() {
   771  	i.closed = true
   772  }
   773  
   774  type FakeBranchIterator struct {
   775  	Data  []*graveler.BranchRecord
   776  	Index int
   777  }
   778  
   779  func NewFakeBranchIterator(data []*graveler.BranchRecord) *FakeBranchIterator {
   780  	return &FakeBranchIterator{Data: data, Index: -1}
   781  }
   782  
   783  func NewFakeBranchIteratorFactory(data []*graveler.BranchRecord) func() graveler.BranchIterator {
   784  	return func() graveler.BranchIterator { return NewFakeBranchIterator(data) }
   785  }
   786  
   787  func (m *FakeBranchIterator) Next() bool {
   788  	if m.Index >= len(m.Data) {
   789  		return false
   790  	}
   791  	m.Index++
   792  	return m.Index < len(m.Data)
   793  }
   794  
   795  func (m *FakeBranchIterator) SeekGE(id graveler.BranchID) {
   796  	m.Index = len(m.Data)
   797  	for i, item := range m.Data {
   798  		if item.BranchID >= id {
   799  			m.Index = i - 1
   800  			return
   801  		}
   802  	}
   803  }
   804  
   805  func (m *FakeBranchIterator) Value() *graveler.BranchRecord {
   806  	return m.Data[m.Index]
   807  }
   808  
   809  func (m *FakeBranchIterator) Err() error {
   810  	return nil
   811  }
   812  
   813  func (m *FakeBranchIterator) Close() {}
   814  
   815  type FakeCommitIterator struct {
   816  	Data  []*graveler.CommitRecord
   817  	Index int
   818  }
   819  
   820  func NewFakeCommitIterator(data []*graveler.CommitRecord) *FakeCommitIterator {
   821  	return &FakeCommitIterator{Data: data, Index: -1}
   822  }
   823  
   824  func (m *FakeCommitIterator) Next() bool {
   825  	if m.Index >= len(m.Data) {
   826  		return false
   827  	}
   828  	m.Index++
   829  	return m.Index < len(m.Data)
   830  }
   831  
   832  func (m *FakeCommitIterator) SeekGE(id graveler.CommitID) {
   833  	m.Index = len(m.Data)
   834  	for i, item := range m.Data {
   835  		if item.CommitID >= id {
   836  			m.Index = i - 1
   837  			return
   838  		}
   839  	}
   840  }
   841  
   842  func (m *FakeCommitIterator) Value() *graveler.CommitRecord {
   843  	return m.Data[m.Index]
   844  }
   845  
   846  func (m *FakeCommitIterator) Err() error {
   847  	return nil
   848  }
   849  
   850  func (m *FakeCommitIterator) Close() {}
   851  
   852  type ProtectedBranchesManagerFake struct {
   853  	graveler.ProtectedBranchesManager
   854  	protectedBranches []string
   855  }
   856  
   857  func NewProtectedBranchesManagerFake(protectedBranches ...string) *ProtectedBranchesManagerFake {
   858  	return &ProtectedBranchesManagerFake{protectedBranches: protectedBranches}
   859  }
   860  
   861  func (p ProtectedBranchesManagerFake) IsBlocked(_ context.Context, _ *graveler.RepositoryRecord, branchID graveler.BranchID, _ graveler.BranchProtectionBlockedAction) (bool, error) {
   862  	for _, branch := range p.protectedBranches {
   863  		if branch == string(branchID) {
   864  			return true, nil
   865  		}
   866  	}
   867  	return false, nil
   868  }
   869  
   870  func (m *RefsFake) GetRepositoryMetadata(_ context.Context, _ graveler.RepositoryID) (graveler.RepositoryMetadata, error) {
   871  	// TODO implement me
   872  	panic("implement me")
   873  }
   874  
   875  func (m *RefsFake) SetRepositoryMetadata(_ context.Context, _ *graveler.RepositoryRecord, _ graveler.RepoMetadataUpdateFunc) error {
   876  	// TODO implement me
   877  	panic("implement me")
   878  }
   879  
   880  func (m *RefsFake) CreateCommitRecord(_ context.Context, _ *graveler.RepositoryRecord, _ graveler.CommitID, _ graveler.Commit) error {
   881  	// TODO implement me
   882  	panic("implement me")
   883  }