test makefiles: add --sparse, --zero, --pattern and --ascii flags
This commit is contained in:
parent
afcea9c72b
commit
118e8e1470
1 changed files with 67 additions and 11 deletions
|
@ -5,6 +5,7 @@ package makefiles
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
|
"math"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
@ -16,6 +17,7 @@ import (
|
||||||
"github.com/rclone/rclone/fs/config/flags"
|
"github.com/rclone/rclone/fs/config/flags"
|
||||||
"github.com/rclone/rclone/lib/file"
|
"github.com/rclone/rclone/lib/file"
|
||||||
"github.com/rclone/rclone/lib/random"
|
"github.com/rclone/rclone/lib/random"
|
||||||
|
"github.com/rclone/rclone/lib/readers"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
)
|
)
|
||||||
|
@ -30,9 +32,14 @@ var (
|
||||||
minFileNameLength = 4
|
minFileNameLength = 4
|
||||||
maxFileNameLength = 12
|
maxFileNameLength = 12
|
||||||
seed = int64(1)
|
seed = int64(1)
|
||||||
|
zero = false
|
||||||
|
sparse = false
|
||||||
|
ascii = false
|
||||||
|
pattern = false
|
||||||
|
|
||||||
// Globals
|
// Globals
|
||||||
randSource *rand.Rand
|
randSource *rand.Rand
|
||||||
|
source io.Reader
|
||||||
directoriesToCreate int
|
directoriesToCreate int
|
||||||
totalDirectories int
|
totalDirectories int
|
||||||
fileNames = map[string]struct{}{} // keep a note of which file name we've used already
|
fileNames = map[string]struct{}{} // keep a note of which file name we've used already
|
||||||
|
@ -55,18 +62,13 @@ func init() {
|
||||||
// Common flags to makefiles and makefile
|
// Common flags to makefiles and makefile
|
||||||
for _, f := range []*pflag.FlagSet{makefilesFlags, makefileFlags} {
|
for _, f := range []*pflag.FlagSet{makefilesFlags, makefileFlags} {
|
||||||
flags.Int64VarP(f, &seed, "seed", "", seed, "Seed for the random number generator (0 for random)")
|
flags.Int64VarP(f, &seed, "seed", "", seed, "Seed for the random number generator (0 for random)")
|
||||||
|
flags.BoolVarP(f, &zero, "zero", "", zero, "Fill files with ASCII 0x00")
|
||||||
|
flags.BoolVarP(f, &sparse, "sparse", "", sparse, "Make the files sparse (appear to be filled with ASCII 0x00)")
|
||||||
|
flags.BoolVarP(f, &ascii, "ascii", "", ascii, "Fill files with random ASCII printable bytes only")
|
||||||
|
flags.BoolVarP(f, &pattern, "pattern", "", ascii, "Fill files with a periodic pattern")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// common initialisation for makefiles and makefile
|
|
||||||
func commonInit() {
|
|
||||||
if seed == 0 {
|
|
||||||
seed = time.Now().UnixNano()
|
|
||||||
fs.Logf(nil, "Using random seed = %d", seed)
|
|
||||||
}
|
|
||||||
randSource = rand.New(rand.NewSource(seed))
|
|
||||||
}
|
|
||||||
|
|
||||||
var makefilesCmd = &cobra.Command{
|
var makefilesCmd = &cobra.Command{
|
||||||
Use: "makefiles <dir>",
|
Use: "makefiles <dir>",
|
||||||
Short: `Make a random file hierarchy in a directory`,
|
Short: `Make a random file hierarchy in a directory`,
|
||||||
|
@ -96,7 +98,7 @@ var makefilesCmd = &cobra.Command{
|
||||||
}
|
}
|
||||||
|
|
||||||
var makefileCmd = &cobra.Command{
|
var makefileCmd = &cobra.Command{
|
||||||
Use: "makefile <size> [<file>]+",
|
Use: "makefile <size> [<file>]+ [flags]",
|
||||||
Short: `Make files with random contents of the size given`,
|
Short: `Make files with random contents of the size given`,
|
||||||
Run: func(command *cobra.Command, args []string) {
|
Run: func(command *cobra.Command, args []string) {
|
||||||
cmd.CheckArgs(1, 1e6, command, args)
|
cmd.CheckArgs(1, 1e6, command, args)
|
||||||
|
@ -120,6 +122,56 @@ var makefileCmd = &cobra.Command{
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func bool2int(b bool) int {
|
||||||
|
if b {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// common initialisation for makefiles and makefile
|
||||||
|
func commonInit() {
|
||||||
|
if seed == 0 {
|
||||||
|
seed = time.Now().UnixNano()
|
||||||
|
fs.Logf(nil, "Using random seed = %d", seed)
|
||||||
|
}
|
||||||
|
randSource = rand.New(rand.NewSource(seed))
|
||||||
|
if bool2int(zero)+bool2int(sparse)+bool2int(ascii)+bool2int(pattern) > 1 {
|
||||||
|
log.Fatal("Can only supply one of --zero, --sparse, --ascii or --pattern")
|
||||||
|
}
|
||||||
|
switch {
|
||||||
|
case zero, sparse:
|
||||||
|
source = zeroReader{}
|
||||||
|
case ascii:
|
||||||
|
source = asciiReader{}
|
||||||
|
case pattern:
|
||||||
|
source = readers.NewPatternReader(math.MaxInt64)
|
||||||
|
default:
|
||||||
|
source = randSource
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type zeroReader struct{}
|
||||||
|
|
||||||
|
// Read a chunk of zeroes
|
||||||
|
func (zeroReader) Read(p []byte) (n int, err error) {
|
||||||
|
for i := range p {
|
||||||
|
p[i] = 0
|
||||||
|
}
|
||||||
|
return len(p), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type asciiReader struct{}
|
||||||
|
|
||||||
|
// Read a chunk of printable ASCII characters
|
||||||
|
func (asciiReader) Read(p []byte) (n int, err error) {
|
||||||
|
n, err = randSource.Read(p)
|
||||||
|
for i := range p[:n] {
|
||||||
|
p[i] = (p[i] % (0x7F - 0x20)) + 0x20
|
||||||
|
}
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
|
||||||
// fileName creates a unique random file or directory name
|
// fileName creates a unique random file or directory name
|
||||||
func fileName() (name string) {
|
func fileName() (name string) {
|
||||||
for {
|
for {
|
||||||
|
@ -184,7 +236,11 @@ func writeFile(dir, name string, size int64) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Failed to open file %q: %v", path, err)
|
log.Fatalf("Failed to open file %q: %v", path, err)
|
||||||
}
|
}
|
||||||
_, err = io.CopyN(fd, randSource, size)
|
if sparse {
|
||||||
|
err = fd.Truncate(size)
|
||||||
|
} else {
|
||||||
|
_, err = io.CopyN(fd, source, size)
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Failed to write %v bytes to file %q: %v", size, path, err)
|
log.Fatalf("Failed to write %v bytes to file %q: %v", size, path, err)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue