mirror of
https://github.com/restic/restic.git
synced 2026-02-03 04:20:45 -05:00
data: test TreeFinder
This commit is contained in:
parent
17688c2313
commit
6de64911fb
2 changed files with 57 additions and 0 deletions
|
|
@ -123,6 +123,7 @@ type TreeFinder struct {
|
|||
next func() (NodeOrError, bool)
|
||||
stop func()
|
||||
current *Node
|
||||
last string
|
||||
}
|
||||
|
||||
func NewTreeFinder(tree TreeNodeIterator) *TreeFinder {
|
||||
|
|
@ -139,6 +140,10 @@ func (t *TreeFinder) Find(name string) (*Node, error) {
|
|||
if t.next == nil {
|
||||
return nil, nil
|
||||
}
|
||||
if name <= t.last {
|
||||
return nil, errors.Errorf("name %q is not greater than last name %q", name, t.last)
|
||||
}
|
||||
t.last = name
|
||||
// loop until `t.current.Name` is >= name
|
||||
for t.current == nil || t.current.Name < name {
|
||||
current, ok := t.next()
|
||||
|
|
|
|||
|
|
@ -224,6 +224,58 @@ func benchmarkLoadTree(t *testing.B, version uint) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestTreeFinderNilIterator(t *testing.T) {
|
||||
finder := data.NewTreeFinder(nil)
|
||||
defer finder.Close()
|
||||
node, err := finder.Find("foo")
|
||||
rtest.OK(t, err)
|
||||
rtest.Equals(t, node, nil, "finder should return nil node")
|
||||
}
|
||||
|
||||
func TestTreeFinderError(t *testing.T) {
|
||||
testErr := errors.New("error")
|
||||
finder := data.NewTreeFinder(slices.Values([]data.NodeOrError{
|
||||
{Node: &data.Node{Name: "a"}, Error: nil},
|
||||
{Node: &data.Node{Name: "b"}, Error: nil},
|
||||
{Node: nil, Error: testErr},
|
||||
}))
|
||||
defer finder.Close()
|
||||
node, err := finder.Find("b")
|
||||
rtest.OK(t, err)
|
||||
rtest.Equals(t, node.Name, "b", "finder should return node with name b")
|
||||
|
||||
node, err = finder.Find("c")
|
||||
rtest.Equals(t, err, testErr, "finder should return correcterror")
|
||||
rtest.Equals(t, node, nil, "finder should return nil node")
|
||||
}
|
||||
|
||||
func TestTreeFinderNotFound(t *testing.T) {
|
||||
finder := data.NewTreeFinder(slices.Values([]data.NodeOrError{
|
||||
{Node: &data.Node{Name: "a"}, Error: nil},
|
||||
}))
|
||||
defer finder.Close()
|
||||
node, err := finder.Find("b")
|
||||
rtest.OK(t, err)
|
||||
rtest.Equals(t, node, nil, "finder should return nil node")
|
||||
// must also be ok multiple times
|
||||
node, err = finder.Find("c")
|
||||
rtest.OK(t, err)
|
||||
rtest.Equals(t, node, nil, "finder should return nil node")
|
||||
}
|
||||
|
||||
func TestTreeFinderWrongOrder(t *testing.T) {
|
||||
finder := data.NewTreeFinder(slices.Values([]data.NodeOrError{
|
||||
{Node: &data.Node{Name: "d"}, Error: nil},
|
||||
}))
|
||||
defer finder.Close()
|
||||
node, err := finder.Find("b")
|
||||
rtest.OK(t, err)
|
||||
rtest.Equals(t, node, nil, "finder should return nil node")
|
||||
node, err = finder.Find("a")
|
||||
rtest.Assert(t, strings.Contains(err.Error(), "is not greater than"), "unexpected error: %v", err)
|
||||
rtest.Equals(t, node, nil, "finder should return nil node")
|
||||
}
|
||||
|
||||
func TestFindTreeDirectory(t *testing.T) {
|
||||
repo := repository.TestRepository(t)
|
||||
sn := data.TestCreateSnapshot(t, repo, parseTimeUTC("2017-07-07 07:07:08"), 3)
|
||||
|
|
|
|||
Loading…
Reference in a new issue