Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions cli/random-data/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"flag"
"fmt"
"io"
"math/rand"
"os"

random "github.com/ipfs/go-test/random"
Expand All @@ -29,11 +28,11 @@ OPTIONS:

var (
b64 bool
seed int64
seed uint64
size int64
)
flag.BoolVar(&b64, "b64", false, "base-64 encode output")
flag.Int64Var(&seed, "seed", 0, "random seed, 0 or unset for current time")
flag.Uint64Var(&seed, "seed", 0, "random seed, 0 or unset for current time")
flag.Int64Var(&size, "size", 0, "number of bytes to generate")
flag.Parse()

Expand All @@ -54,12 +53,12 @@ OPTIONS:
}
}

func writeData(seed, size int64, b64 bool) error {
var rnd *rand.Rand
func writeData(seed uint64, size int64, b64 bool) error {
var rnd *random.Random
if seed == 0 {
rnd = random.NewRand()
rnd = random.New()
} else {
rnd = random.NewSeededRand(seed)
rnd = random.NewSeeded(random.MakeSeed(seed))
}

var w io.Writer
Expand Down
7 changes: 6 additions & 1 deletion cli/random-files/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ OPTIONS:
var (
quiet bool
paths []string
seed string
)

cfg := files.DefaultConfig()
Expand All @@ -38,7 +39,7 @@ OPTIONS:
flag.BoolVar(&cfg.RandomDirs, "random-dirs", cfg.RandomDirs, "randomize number of subdirectories, from 1 to -dirs")
flag.BoolVar(&cfg.RandomFiles, "random-files", cfg.RandomFiles, "randomize number of files, from 1 to -files")
flag.BoolVar(&cfg.RandomSize, "random-size", cfg.RandomSize, "randomize file size, from 1 to -filesize")
flag.Int64Var(&cfg.Seed, "seed", cfg.Seed, "random seed, 0 for current time")
flag.StringVar(&seed, "seed", "", "random seed, leave empty to use random value")
flag.Parse()

paths = flag.Args()
Expand All @@ -47,6 +48,10 @@ OPTIONS:
cfg.Out = os.Stdout
}

if len(seed) != 0 {
cfg.Seed = []byte(seed)
}

err := files.Create(cfg, paths...)
if err != nil {
fmt.Fprintln(os.Stderr, "error:", err)
Expand Down
55 changes: 30 additions & 25 deletions random/files/files.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,15 @@ import (
"errors"
"fmt"
"io"
"math/rand"
"os"
"path/filepath"

"github.com/ipfs/go-test/random"
)

const (
MinimumNameSize = 4
fileNameAlpha = "abcdefghijklmnopqrstuvwxyz01234567890-_"
MinimumNameSize = 4
fileNameAlphabet = "abcdefghijklmnopqrstuvwxyz0123456789-_"
)

// Config contains settings for creating random files and directories.
Expand Down Expand Up @@ -42,9 +41,9 @@ type Config struct {
// RandomSize specifies whether or not to randomize the file size from 1 to
// the value configured by FileSize.
RandomSize bool
// Seed sets the seen for the random number generator when set to a
// non-zero value.
Seed int64
// Seed sets the seed for the random number generator when set to a
// non-empty value.
Seed []byte
}

// DefaultConfig returns default settings for creating random files and
Expand Down Expand Up @@ -75,11 +74,13 @@ func Create(cfg Config, roots ...string) error {
return err
}

var rnd *rand.Rand
if cfg.Seed == 0 {
rnd = random.NewRand()
var rnd *random.Random
if len(cfg.Seed) == 0 {
rnd = random.New()
} else {
rnd = random.NewSeededRand(cfg.Seed)
var seed [32]byte
copy(seed[:], cfg.Seed)
rnd = random.NewSeeded(seed)
}

for _, root := range roots {
Expand Down Expand Up @@ -128,7 +129,7 @@ func RandomName(sizes ...int) string {
cfg = DefaultConfig()
}

return cfg.randomName(random.NewRand())
return cfg.randomName(random.New())
}

func (cfg *Config) validate() error {
Expand Down Expand Up @@ -165,11 +166,11 @@ func validateNameSize(minSize, maxSize int) error {
return nil
}

func (cfg *Config) writeTree(rnd *rand.Rand, root string, depth int) error {
func (cfg *Config) writeTree(rnd *random.Random, root string, depth int) error {
nFiles := cfg.Files
if nFiles != 0 {
if cfg.RandomFiles && nFiles > 1 {
nFiles = rnd.Intn(nFiles) + 1
nFiles = rnd.IntN(nFiles) + 1
}

for i := 0; i < nFiles; i++ {
Expand All @@ -182,15 +183,15 @@ func (cfg *Config) writeTree(rnd *rand.Rand, root string, depth int) error {
return cfg.writeSubdirs(rnd, root, depth)
}

func (cfg *Config) writeSubdirs(rnd *rand.Rand, root string, depth int) error {
func (cfg *Config) writeSubdirs(rnd *random.Random, root string, depth int) error {
if depth == cfg.Depth {
return nil
}
depth++

nDirs := cfg.Dirs
if cfg.RandomDirs && nDirs > 1 {
nDirs = rnd.Intn(nDirs) + 1
nDirs = rnd.IntN(nDirs) + 1
}

for i := 0; i < nDirs; i++ {
Expand All @@ -202,7 +203,7 @@ func (cfg *Config) writeSubdirs(rnd *rand.Rand, root string, depth int) error {
return nil
}

func (cfg *Config) writeSubdir(rnd *rand.Rand, root string, depth int) error {
func (cfg *Config) writeSubdir(rnd *random.Random, root string, depth int) error {
name := cfg.randomName(rnd)
root = filepath.Join(root, name)
if err := os.MkdirAll(root, 0755); err != nil {
Expand All @@ -216,20 +217,24 @@ func (cfg *Config) writeSubdir(rnd *rand.Rand, root string, depth int) error {
return cfg.writeTree(rnd, root, depth)
}

func (cfg *Config) randomName(rnd *rand.Rand) string {
func (cfg *Config) randomName(rnd *random.Random) string {
sizeDiff := cfg.NameMaxSize - cfg.NameMinSize
n := cfg.NameMinSize
size := cfg.NameMinSize
if sizeDiff != 0 {
n += rnd.Intn(sizeDiff)
size += rnd.IntN(sizeDiff + 1)
}
b := make([]byte, n)
for i := 0; i < n; i++ {
b[i] = fileNameAlpha[rnd.Intn(len(fileNameAlpha))]
if size <= 0 {
return ""
}
return string(b)
src := make([]byte, size)
rnd.Read(src)
for i := range src {
src[i] = fileNameAlphabet[src[i]%byte(len(fileNameAlphabet))]
}
return string(src)
}

func (cfg *Config) writeFile(rnd *rand.Rand, root string) error {
func (cfg *Config) writeFile(rnd *random.Random, root string) error {
name := cfg.randomName(rnd)
filePath := filepath.Join(root, name)
f, err := os.Create(filePath)
Expand All @@ -240,7 +245,7 @@ func (cfg *Config) writeFile(rnd *rand.Rand, root string) error {
if cfg.FileSize > 0 {
fileSize := cfg.FileSize
if cfg.RandomSize && fileSize > 1 {
fileSize = rnd.Int63n(fileSize) + 1
fileSize = rnd.Int64N(fileSize) + 1
}

if _, err := io.CopyN(f, rnd, fileSize); err != nil {
Expand Down
Loading
Loading