test makefiles: add --sparse, --zero, --pattern and --ascii flags

This commit is contained in:
Nick Craig-Wood 2022-04-12 13:37:35 +01:00
parent afcea9c72b
commit 118e8e1470

View File

@ -5,6 +5,7 @@ package makefiles
import (
"io"
"log"
"math"
"math/rand"
"os"
"path/filepath"
@ -16,6 +17,7 @@ import (
"github.com/rclone/rclone/fs/config/flags"
"github.com/rclone/rclone/lib/file"
"github.com/rclone/rclone/lib/random"
"github.com/rclone/rclone/lib/readers"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
)
@ -30,9 +32,14 @@ var (
minFileNameLength = 4
maxFileNameLength = 12
seed = int64(1)
zero = false
sparse = false
ascii = false
pattern = false
// Globals
randSource *rand.Rand
source io.Reader
directoriesToCreate int
totalDirectories int
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
for _, f := range []*pflag.FlagSet{makefilesFlags, makefileFlags} {
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{
Use: "makefiles <dir>",
Short: `Make a random file hierarchy in a directory`,
@ -96,7 +98,7 @@ var makefilesCmd = &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`,
Run: func(command *cobra.Command, args []string) {
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
func fileName() (name string) {
for {
@ -184,7 +236,11 @@ func writeFile(dir, name string, size int64) {
if err != nil {
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 {
log.Fatalf("Failed to write %v bytes to file %q: %v", size, path, err)
}