syncthing/test/genfiles.go

129 lines
2.6 KiB
Go
Raw Normal View History

2014-11-16 20:13:20 +00:00
// Copyright (C) 2014 The Syncthing Authors.
2014-09-29 19:43:32 +00:00
//
// This program is free software: you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the Free
// Software Foundation, either version 3 of the License, or (at your option)
// any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
// more details.
//
// You should have received a copy of the GNU General Public License along
// with this program. If not, see <http://www.gnu.org/licenses/>.
2014-06-01 20:50:14 +00:00
2014-04-22 06:27:00 +00:00
// +build ignore
2014-03-14 09:39:37 +00:00
package main
import (
"flag"
"fmt"
2014-07-26 06:15:59 +00:00
"io"
"log"
2014-09-27 18:09:36 +00:00
"math/rand"
2014-03-14 09:39:37 +00:00
"os"
"path/filepath"
2014-03-14 09:39:37 +00:00
"time"
)
2014-09-27 18:09:36 +00:00
func ReadRand(bs []byte) (int, error) {
var r uint32
for i := range bs {
if i%4 == 0 {
r = uint32(rand.Int63())
}
bs[i] = byte(r >> uint((i%4)*8))
}
return len(bs), nil
}
2014-03-14 09:39:37 +00:00
func name() string {
var b [16]byte
2014-09-27 18:09:36 +00:00
ReadRand(b[:])
2014-03-14 09:39:37 +00:00
return fmt.Sprintf("%x", b[:])
}
func main() {
var files int
var maxexp int
2014-07-26 06:15:59 +00:00
var srcname string
2014-09-28 05:31:53 +00:00
var random bool
2014-03-14 09:39:37 +00:00
flag.IntVar(&files, "files", 1000, "Number of files")
flag.IntVar(&maxexp, "maxexp", 20, "Maximum file size (max = 2^n + 128*1024 B)")
2014-07-26 06:15:59 +00:00
flag.StringVar(&srcname, "src", "/usr/share/dict/words", "Source material")
2014-09-28 05:31:53 +00:00
flag.BoolVar(&random, "random", true, "When false, always generate the same set of file")
2014-03-14 09:39:37 +00:00
flag.Parse()
2014-09-28 05:31:53 +00:00
if random {
rand.Seed(time.Now().UnixNano())
} else {
rand.Seed(42)
}
2014-07-26 06:15:59 +00:00
fd, err := os.Open(srcname)
if err != nil {
log.Fatal(err)
}
2014-03-14 09:39:37 +00:00
for i := 0; i < files; i++ {
n := name()
p0 := filepath.Join(string(n[0]), n[0:2])
2014-07-26 06:15:59 +00:00
err = os.MkdirAll(p0, 0755)
if err != nil {
log.Fatal(err)
}
2014-09-27 18:09:36 +00:00
s := 1 << uint(rand.Intn(maxexp))
2014-03-14 09:39:37 +00:00
a := 128 * 1024
if a > s {
a = s
}
2014-09-27 18:09:36 +00:00
s += rand.Intn(a)
2014-07-26 06:15:59 +00:00
src := io.LimitReader(&inifiteReader{fd}, int64(s))
p1 := filepath.Join(p0, n)
2014-07-26 06:15:59 +00:00
dst, err := os.Create(p1)
if err != nil {
log.Fatal(err)
}
_, err = io.Copy(dst, src)
if err != nil {
log.Fatal(err)
}
2014-03-14 09:39:37 +00:00
2014-07-26 06:15:59 +00:00
err = dst.Close()
if err != nil {
log.Fatal(err)
}
2014-09-27 18:09:36 +00:00
err = os.Chmod(p1, os.FileMode(rand.Intn(0777)|0400))
2014-07-26 06:15:59 +00:00
if err != nil {
log.Fatal(err)
}
2014-03-14 09:39:37 +00:00
2014-09-27 18:09:36 +00:00
t := time.Now().Add(-time.Duration(rand.Intn(30*86400)) * time.Second)
2014-07-26 06:15:59 +00:00
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)
2014-03-14 09:39:37 +00:00
}
2014-07-26 06:15:59 +00:00
return n, err
2014-03-14 09:39:37 +00:00
}