Add tests for bug #101

This commit is contained in:
Alexander Neumann 2015-03-15 14:24:58 +01:00
parent c9ee79fc54
commit 1bb82afcf6
4 changed files with 68 additions and 21 deletions

View File

@ -4,6 +4,7 @@ import (
"errors"
"fmt"
"os"
"path"
"path/filepath"
"sort"
@ -82,13 +83,13 @@ func isFile(fi os.FileInfo) bool {
var errCancelled = errors.New("walk cancelled")
func walk(basedir, path string, done chan struct{}, jobs chan<- Job, res chan<- Result) error {
info, err := os.Lstat(path)
func walk(basedir, dir string, done chan struct{}, jobs chan<- Job, res chan<- Result) error {
info, err := os.Lstat(dir)
if err != nil {
return err
}
relpath, _ := filepath.Rel(basedir, path)
relpath, _ := filepath.Rel(basedir, dir)
if !info.IsDir() {
select {
@ -99,15 +100,29 @@ func walk(basedir, path string, done chan struct{}, jobs chan<- Job, res chan<-
return nil
}
names, err := readDirNames(path)
names, err := readDirNames(dir)
if err != nil {
return err
}
// Insert breakpoint to allow testing behaviour with vanishing files
// between Readdir() and lstat()
debug.BreakIf("pipe.walk1", func() bool {
match, err := path.Match(os.Getenv("DEBUG_BREAK_PIPE"), relpath)
if err != nil {
panic(err)
}
if match {
debug.Log("break", "break pattern matches for %v\n", relpath)
}
return match
})
entries := make([]<-chan Result, 0, len(names))
for _, name := range names {
subpath := filepath.Join(path, name)
subpath := filepath.Join(dir, name)
ch := make(chan Result, 1)
entries = append(entries, ch)
@ -122,6 +137,22 @@ func walk(basedir, path string, done chan struct{}, jobs chan<- Job, res chan<-
continue
}
// Insert breakpoint to allow testing behaviour with vanishing files
// between walk and open
debug.BreakIf("pipe.walk2", func() bool {
p := filepath.Join(relpath, name)
match, err := path.Match(os.Getenv("DEBUG_BREAK_PIPE"), p)
if err != nil {
panic(err)
}
if match {
debug.Log("break", "break pattern matches for %v\n", p)
}
return match
})
if isDir(fi) {
err = walk(basedir, subpath, done, jobs, ch)
if err != nil {

View File

@ -1,16 +0,0 @@
set -em
# setup restic
prepare
run restic init
# start backup, break before saving files
DEBUG_BREAK=Archiver.Snapshot run restic.debug backup "${BASE}/fake-data" && debug "done"
# remove file
rm -f "${BASE}/fake-data/0/0/9/37"
# resume backup
fg
cleanup

View File

@ -0,0 +1,16 @@
set -em
# setup restic
prepare
run restic init
# start backup, break between readdir and lstat
DEBUG_BREAK=pipe.walk1 DEBUG_BREAK_PIPE="fake-data/0/0/9" run restic.debug backup "${BASE}/fake-data" && debug "done"
# remove file
rm -f "${BASE}/fake-data/0/0/9/37"
# resume backup
fg
cleanup

View File

@ -0,0 +1,16 @@
set -em
# setup restic
prepare
run restic init
# start backup, break between walk and save
DEBUG_BREAK=pipe.walk2 DEBUG_BREAK_PIPE="fake-data/0/0/9/37" run restic.debug backup "${BASE}/fake-data" && debug "done"
# remove file
rm -f "${BASE}/fake-data/0/0/9/37"
# resume backup
fg
cleanup