github.com/10XDev/rclone@v1.52.3-0.20200626220027-16af9ab76b2a/cmd/mount/test/seeker.go (about) 1 // +build ignore 2 3 // Read two files with lots of seeking to stress test the seek code 4 package main 5 6 import ( 7 "bytes" 8 "flag" 9 "io" 10 "io/ioutil" 11 "log" 12 "math/rand" 13 "os" 14 "time" 15 ) 16 17 var ( 18 // Flags 19 iterations = flag.Int("n", 1e6, "Iterations to try") 20 maxBlockSize = flag.Int("b", 1024*1024, "Max block size to read") 21 ) 22 23 func init() { 24 rand.Seed(time.Now().UnixNano()) 25 } 26 27 func randomSeekTest(size int64, in1, in2 *os.File, file1, file2 string) { 28 start := rand.Int63n(size) 29 blockSize := rand.Intn(*maxBlockSize) 30 if int64(blockSize) > size-start { 31 blockSize = int(size - start) 32 } 33 log.Printf("Reading %d from %d", blockSize, start) 34 35 _, err := in1.Seek(start, io.SeekStart) 36 if err != nil { 37 log.Fatalf("Seek failed on %q: %v", file1, err) 38 } 39 _, err = in2.Seek(start, io.SeekStart) 40 if err != nil { 41 log.Fatalf("Seek failed on %q: %v", file2, err) 42 } 43 44 buf1 := make([]byte, blockSize) 45 n1, err := io.ReadFull(in1, buf1) 46 if err != nil { 47 log.Fatalf("Read failed on %q: %v", file1, err) 48 } 49 50 buf2 := make([]byte, blockSize) 51 n2, err := io.ReadFull(in2, buf2) 52 if err != nil { 53 log.Fatalf("Read failed on %q: %v", file2, err) 54 } 55 56 if n1 != n2 { 57 log.Fatalf("Read different lengths %d (%q) != %d (%q)", n1, file1, n2, file2) 58 } 59 60 if !bytes.Equal(buf1, buf2) { 61 log.Printf("Dumping different blocks") 62 err = ioutil.WriteFile("/tmp/z1", buf1, 0777) 63 if err != nil { 64 log.Fatalf("Failed to write /tmp/z1: %v", err) 65 } 66 err = ioutil.WriteFile("/tmp/z2", buf2, 0777) 67 if err != nil { 68 log.Fatalf("Failed to write /tmp/z2: %v", err) 69 } 70 log.Fatalf("Read different contents - saved in /tmp/z1 and /tmp/z2") 71 } 72 } 73 74 func main() { 75 flag.Parse() 76 args := flag.Args() 77 if len(args) != 2 { 78 log.Fatalf("Require 2 files as argument") 79 } 80 file1, file2 := args[0], args[1] 81 in1, err := os.Open(file1) 82 if err != nil { 83 log.Fatalf("Couldn't open %q: %v", file1, err) 84 } 85 in2, err := os.Open(file2) 86 if err != nil { 87 log.Fatalf("Couldn't open %q: %v", file2, err) 88 } 89 90 fi1, err := in1.Stat() 91 if err != nil { 92 log.Fatalf("Couldn't stat %q: %v", file1, err) 93 } 94 fi2, err := in2.Stat() 95 if err != nil { 96 log.Fatalf("Couldn't stat %q: %v", file2, err) 97 } 98 99 if fi1.Size() != fi2.Size() { 100 log.Fatalf("Files not the same size") 101 } 102 103 for i := 0; i < *iterations; i++ { 104 randomSeekTest(fi1.Size(), in1, in2, file1, file2) 105 } 106 107 err = in1.Close() 108 if err != nil { 109 log.Fatalf("Error closing %q: %v", file1, err) 110 } 111 err = in2.Close() 112 if err != nil { 113 log.Fatalf("Error closing %q: %v", file2, err) 114 } 115 }