diff --git a/integration/.gitignore b/integration/.gitignore new file mode 100644 index 000000000..fa7a16d8c --- /dev/null +++ b/integration/.gitignore @@ -0,0 +1,5 @@ +files-* +conf-* +md5-* +genfiles +md5r diff --git a/integration/genfiles.go b/integration/genfiles.go new file mode 100644 index 000000000..763fb66af --- /dev/null +++ b/integration/genfiles.go @@ -0,0 +1,37 @@ +package main + +import ( + "crypto/rand" + "flag" + "fmt" + "io/ioutil" + mr "math/rand" + "os" + "path" +) + +func name() string { + var b [16]byte + rand.Reader.Read(b[:]) + return fmt.Sprintf("%x", b[:]) +} + +func main() { + var files int + var maxsize int + + flag.IntVar(&files, "files", 1000, "Number of files") + flag.IntVar(&maxsize, "maxsize", 1000, "Maximum file size (KB)") + flag.Parse() + + for i := 0; i < files; i++ { + n := name() + p0 := path.Join(string(n[0]), n[0:2]) + os.MkdirAll(p0, 0755) + s := mr.Intn(maxsize * 1024) + b := make([]byte, s) + rand.Reader.Read(b) + p1 := path.Join(p0, n) + ioutil.WriteFile(p1, b, 0644) + } +} diff --git a/integration/md5r.go b/integration/md5r.go new file mode 100644 index 000000000..c2d1b990b --- /dev/null +++ b/integration/md5r.go @@ -0,0 +1,59 @@ +package main + +import ( + "crypto/md5" + "flag" + "fmt" + "io" + "os" + "path/filepath" +) + +func main() { + flag.Parse() + args := flag.Args() + + if len(args) == 0 { + args = []string{"."} + } + + for _, path := range args { + err := filepath.Walk(path, walker) + + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + } +} + +func walker(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if !info.IsDir() { + sum, err := md5file(path) + if err != nil { + return err + } + fmt.Printf("%s %s\n", sum, path) + } + + return nil +} + +func md5file(fname string) (hash string, err error) { + f, err := os.Open(fname) + if err != nil { + return + } + defer f.Close() + + h := md5.New() + io.Copy(h, f) + hb := h.Sum(nil) + hash = fmt.Sprintf("%x", hb) + + return +} diff --git a/integration/test.sh b/integration/test.sh new file mode 100755 index 000000000..265be27ee --- /dev/null +++ b/integration/test.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +rm -rf files-* conf-* md5-* + +p=$(pwd) + +go build genfiles.go +go build md5r.go + +echo "Setting up (keys)..." +i1=$(syncthing -c conf-1 2>&1 | awk '/My ID/ {print $6}') +echo $i1 +i2=$(syncthing -c conf-2 2>&1 | awk '/My ID/ {print $6}') +echo $i2 +i3=$(syncthing -c conf-3 2>&1 | awk '/My ID/ {print $6}') +echo $i3 + +echo "Setting up (files)..." +for i in 1 2 3 ; do + cat >conf-$i/syncthing.ini </dev/null + ../genfiles -maxsize 780 -files 1500 + ../md5r > ../md5-$i + popd >/dev/null +done + +echo "Starting..." +for i in 1 2 3 ; do + syncthing -c conf-$i --no-gui -l :2200$i & +done + +cat md5-* | sort > md5-tot +while true ; do + sleep 10 + conv=0 + for i in 1 2 3 ; do + pushd files-$i >/dev/null + ../md5r | sort > ../md5-$i + popd >/dev/null + if ! cmp md5-$i md5-tot >/dev/null ; then + echo $i unconverged + else + conv=$((conv + 1)) + echo $i converged + fi + done + + if [[ $conv == 3 ]] ; then + kill %1 + kill %2 + kill %3 + exit + fi +done +