From 5bf7d372f6a48ff7a6710d02a1c7198d5aa4a68c Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Sat, 26 Jul 2014 08:15:59 +0200 Subject: [PATCH] Genfiles use actual source data --- integration/f1/config.xml | 2 +- integration/genfiles.go | 61 ++++++++++++++++++++++++++++++++++----- 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/integration/f1/config.xml b/integration/f1/config.xml index 101b591c7..111c1607f 100644 --- a/integration/f1/config.xml +++ b/integration/f1/config.xml @@ -21,7 +21,7 @@ true 21025 16 - 50 + 500 10 5 10000 diff --git a/integration/genfiles.go b/integration/genfiles.go index 3e84c1178..b1b3fa47b 100644 --- a/integration/genfiles.go +++ b/integration/genfiles.go @@ -10,7 +10,8 @@ import ( "crypto/rand" "flag" "fmt" - "io/ioutil" + "io" + "log" mr "math/rand" "os" "path/filepath" @@ -26,29 +27,73 @@ func name() string { func main() { var files int var maxexp int + var srcname string flag.IntVar(&files, "files", 1000, "Number of files") flag.IntVar(&maxexp, "maxexp", 20, "Maximum file size (max = 2^n + 128*1024 B)") + flag.StringVar(&srcname, "src", "/usr/share/dict/words", "Source material") flag.Parse() + fd, err := os.Open(srcname) + if err != nil { + log.Fatal(err) + } + for i := 0; i < files; i++ { n := name() p0 := filepath.Join(string(n[0]), n[0:2]) - os.MkdirAll(p0, 0755) + err = os.MkdirAll(p0, 0755) + if err != nil { + log.Fatal(err) + } + s := 1 << uint(mr.Intn(maxexp)) a := 128 * 1024 if a > s { a = s } s += mr.Intn(a) - b := make([]byte, s) - rand.Reader.Read(b) - p1 := filepath.Join(p0, n) - ioutil.WriteFile(p1, b, 0644) - os.Chmod(p1, os.FileMode(mr.Intn(0777)|0400)) + src := io.LimitReader(&inifiteReader{fd}, int64(s)) + + p1 := filepath.Join(p0, n) + dst, err := os.Create(p1) + if err != nil { + log.Fatal(err) + } + + _, err = io.Copy(dst, src) + if err != nil { + log.Fatal(err) + } + + err = dst.Close() + if err != nil { + log.Fatal(err) + } + + err = os.Chmod(p1, os.FileMode(mr.Intn(0777)|0400)) + if err != nil { + log.Fatal(err) + } t := time.Now().Add(-time.Duration(mr.Intn(30*86400)) * time.Second) - os.Chtimes(p1, t, t) + err = os.Chtimes(p1, t, t) + if err != nil { + log.Fatal(err) + } } } + +type inifiteReader struct { + rd io.ReadSeeker +} + +func (i *inifiteReader) Read(bs []byte) (int, error) { + n, err := i.rd.Read(bs) + if err == io.EOF { + err = nil + i.rd.Seek(0, 0) + } + return n, err +}