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 }