2015-03-02 13:48:47 +00:00
|
|
|
package restic_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
|
|
|
"path/filepath"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/restic/restic"
|
|
|
|
"github.com/restic/restic/pipe"
|
|
|
|
)
|
|
|
|
|
|
|
|
var testWalkDirectory = flag.String("test.walkdir", ".", "test walking a directory (globbing pattern, default: .)")
|
|
|
|
|
|
|
|
func TestWalkTree(t *testing.T) {
|
|
|
|
dirs, err := filepath.Glob(*testWalkDirectory)
|
|
|
|
ok(t, err)
|
|
|
|
|
2015-03-28 14:07:08 +00:00
|
|
|
server := setupBackend(t)
|
|
|
|
defer teardownBackend(t, server)
|
|
|
|
key := setupKey(t, server, "geheim")
|
|
|
|
server.SetKey(key)
|
2015-03-02 13:48:47 +00:00
|
|
|
|
|
|
|
// archive a few files
|
|
|
|
arch, err := restic.NewArchiver(server)
|
|
|
|
ok(t, err)
|
|
|
|
sn, _, err := arch.Snapshot(nil, dirs, nil)
|
|
|
|
ok(t, err)
|
|
|
|
|
|
|
|
// start benchmark
|
|
|
|
// t.ResetTimer()
|
|
|
|
|
|
|
|
// for i := 0; i < t.N; i++ {
|
|
|
|
|
|
|
|
done := make(chan struct{})
|
|
|
|
|
|
|
|
// start tree walker
|
|
|
|
treeJobs := make(chan restic.WalkTreeJob)
|
2015-03-28 14:07:08 +00:00
|
|
|
go restic.WalkTree(server, sn.Tree, done, treeJobs)
|
2015-03-02 13:48:47 +00:00
|
|
|
|
|
|
|
// start filesystem walker
|
2015-03-07 10:53:32 +00:00
|
|
|
fsJobs := make(chan pipe.Job)
|
|
|
|
resCh := make(chan pipe.Result, 1)
|
|
|
|
go pipe.Walk(dirs, done, fsJobs, resCh)
|
2015-03-02 13:48:47 +00:00
|
|
|
|
|
|
|
for {
|
|
|
|
// receive fs job
|
|
|
|
fsJob, fsChOpen := <-fsJobs
|
|
|
|
assert(t, !fsChOpen || fsJob != nil,
|
|
|
|
"received nil job from filesystem: %v %v", fsJob, fsChOpen)
|
|
|
|
|
|
|
|
var path string
|
|
|
|
fsEntries := 1
|
|
|
|
switch j := fsJob.(type) {
|
|
|
|
case pipe.Dir:
|
2015-03-07 10:53:32 +00:00
|
|
|
path = j.Path()
|
2015-03-02 13:48:47 +00:00
|
|
|
fsEntries = len(j.Entries)
|
|
|
|
case pipe.Entry:
|
2015-03-07 10:53:32 +00:00
|
|
|
path = j.Path()
|
2015-03-02 13:48:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// receive tree job
|
|
|
|
treeJob, treeChOpen := <-treeJobs
|
|
|
|
treeEntries := 1
|
|
|
|
|
|
|
|
if treeJob.Tree != nil {
|
|
|
|
treeEntries = len(treeJob.Tree.Nodes)
|
|
|
|
}
|
|
|
|
|
|
|
|
assert(t, fsChOpen == treeChOpen,
|
|
|
|
"one channel closed too early: fsChOpen %v, treeChOpen %v",
|
|
|
|
fsChOpen, treeChOpen)
|
|
|
|
|
|
|
|
if !fsChOpen || !treeChOpen {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
|
|
|
|
assert(t, filepath.Base(path) == filepath.Base(treeJob.Path),
|
|
|
|
"paths do not match: %q != %q", filepath.Base(path), filepath.Base(treeJob.Path))
|
|
|
|
|
|
|
|
assert(t, fsEntries == treeEntries,
|
|
|
|
"wrong number of entries: %v != %v", fsEntries, treeEntries)
|
|
|
|
}
|
|
|
|
// }
|
|
|
|
}
|