| 1 | package lease |
| 2 | |
| 3 | import ( |
| 4 | "context" |
| 5 | "errors" |
| 6 | "testing" |
| 7 | |
| 8 | "github.com/superfly/ltx" |
| 9 | ) |
| 10 | |
| 11 | type fakeLister struct { |
| 12 | levels map[int][]*ltx.FileInfo |
| 13 | err error |
| 14 | asked []int |
| 15 | } |
| 16 | |
| 17 | func (f *fakeLister) LTXFiles(_ context.Context, level int, _ ltx.TXID, _ bool) (ltx.FileIterator, error) { |
| 18 | f.asked = append(f.asked, level) |
| 19 | if f.err != nil { |
| 20 | return nil, f.err |
| 21 | } |
| 22 | return ltx.NewFileInfoSliceIterator(f.levels[level]), nil |
| 23 | } |
| 24 | |
| 25 | func TestHasReplicaIn(t *testing.T) { |
| 26 | ctx := context.Background() |
| 27 | empty := &fakeLister{} |
| 28 | if has, err := hasReplicaIn(ctx, empty); has || err != nil { |
| 29 | t.Fatalf("empty = %v, %v", has, err) |
| 30 | } |
| 31 | if len(empty.asked) != 10 { |
| 32 | t.Fatalf("levels asked = %v, want 0 to 9", empty.asked) |
| 33 | } |
| 34 | snap := &fakeLister{levels: map[int][]*ltx.FileInfo{9: {{Level: 9, MinTXID: 1, MaxTXID: 7, Size: 4096}}}} |
| 35 | if has, err := hasReplicaIn(ctx, snap); !has || err != nil { |
| 36 | t.Fatalf("a snapshot at level 9 = %v, %v", has, err) |
| 37 | } |
| 38 | broken := &fakeLister{err: errors.New("listing failed")} |
| 39 | if has, err := hasReplicaIn(ctx, broken); has || err == nil { |
| 40 | t.Fatalf("a failed listing = %v, %v; want an error, never false", has, err) |
| 41 | } |
| 42 | } |
| 43 | |