github.com/hikaru7719/go@v0.0.0-20181025140707-c8b2ac68906a/src/internal/traceparser/filebuf/filebuf_test.go (about) 1 // Copyright 2018 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package filebuf 6 7 import ( 8 "bytes" 9 "io" 10 "io/ioutil" 11 "log" 12 "os" 13 "testing" 14 ) 15 16 var ( 17 inited bool 18 small, large string // files 19 dir string // in this dir 20 contents []byte // contents of the large file 21 ) 22 23 func TestMain(m *testing.M) { 24 create() 25 n := m.Run() 26 27 os.RemoveAll(dir) 28 os.Exit(n) 29 } 30 31 func create() { 32 if inited { 33 return 34 } 35 log.SetFlags(log.Lshortfile) 36 d, erra := ioutil.TempDir("", "filebuf") 37 s, errb := ioutil.TempFile(dir, "small") 38 l, errc := ioutil.TempFile(dir, "large") 39 if erra != nil || errb != nil || errc != nil { 40 log.Fatal(erra, errb, errc) 41 } 42 dir, small, large = d, s.Name(), l.Name() 43 buf := make([]byte, 2*Buflen+3) 44 for i := 0; i < len(buf); i++ { 45 buf[i] = byte(i) 46 } 47 err := ioutil.WriteFile(small, buf[:7], 0666) 48 if err != nil { 49 log.Fatal(err) 50 } 51 err = ioutil.WriteFile(large, buf, 0666) 52 if err != nil { 53 log.Fatal(err) 54 } 55 contents = buf 56 inited = true 57 } 58 59 func get(n int) io.Reader { 60 if n <= len(contents) { 61 return bytes.NewReader(contents[:n]) 62 } 63 return bytes.NewReader(contents) 64 } 65 66 func TestSmall(t *testing.T) { 67 var f Buf 68 var err error 69 f, err = New(small) 70 small := func(t *testing.T) { 71 if err != nil { 72 t.Fatal(err) 73 } 74 buf := make([]byte, 23) 75 n, err := f.Read(buf) 76 if n != 7 || err != io.EOF { 77 t.Errorf("got %d, expected 7, %v", n, err) 78 } 79 m, err := f.Seek(0, io.SeekCurrent) 80 if m != 7 || err != nil { 81 t.Errorf("got %d, expected 7, %v", m, err) 82 } 83 m, err = f.Seek(1, io.SeekStart) 84 if m != 1 || err != nil { 85 t.Errorf("got %d expected 1, %v", m, err) 86 } 87 n, err = f.Read(buf) 88 if n != 6 || err != io.EOF { 89 t.Errorf("got %d, expected 6, %v", n, err) 90 } 91 for i := 0; i < 6; i++ { 92 if buf[i] != byte(i+1) { 93 t.Fatalf("byte %d is %d, not %d, %v", i, buf[i], i+1, buf) 94 } 95 } 96 } 97 t.Run("New", small) 98 f, err = FromReader(get(7)) 99 t.Run("Rdr", small) 100 } 101 102 func TestLarge(t *testing.T) { 103 var f Buf 104 var err error 105 big := func(t *testing.T) { 106 if err != nil { 107 t.Fatal(err) 108 } 109 x := Buflen - 7 110 n, err := f.Seek(int64(x), io.SeekStart) 111 if n != Buflen-7 || err != nil { 112 t.Fatalf("expected %d, got %d, %v", x, n, err) 113 } 114 buf := make([]byte, 23) 115 m, err := f.Read(buf) 116 if m != len(buf) || err != nil { 117 t.Fatalf("expected %d, got %d, %v", len(buf), m, err) 118 } 119 for i := 0; i < 23; i++ { 120 if buf[i] != byte(x+i) { 121 t.Fatalf("byte %d, got %d, wanted %d", i, buf[i], 122 byte(x+i)) 123 } 124 } 125 m, err = f.Read(buf) 126 if m != len(buf) || err != nil { 127 t.Fatalf("got %d, expected %d, %v", m, len(buf), err) 128 } 129 x += len(buf) 130 for i := 0; i < 23; i++ { 131 if buf[i] != byte(x+i) { 132 t.Fatalf("byte %d, got %d, wanted %d", i, buf[i], 133 byte(x+i)) 134 } 135 } 136 } 137 f, err = New(large) 138 t.Run("New", big) 139 f, err = FromReader(get(1 << 30)) 140 t.Run("Rdr", big) 141 } 142 143 func TestMore(t *testing.T) { 144 f, err := New(large) 145 if err != nil { 146 t.Fatal(err) 147 } 148 var a, b [4]byte 149 f.Seek(16, 0) 150 f.Read(a[:]) 151 f.Seek(16, 0) 152 f.Read(b[:]) 153 if a != b { 154 t.Errorf("oops %v %v", a, b) 155 } 156 } 157 158 func TestSeek(t *testing.T) { 159 f, err := New(small) 160 if err != nil { 161 log.Fatal(err) 162 } 163 n, err := f.Seek(f.Size(), 0) 164 if n != f.Size() || err != nil { 165 t.Errorf("seek got %d, expected %d, %v", n, f.Size(), err) 166 } 167 n, err = f.Seek(1, io.SeekCurrent) 168 if n != f.Size() || err != io.EOF { 169 t.Errorf("n=%d, expected 0. %v", n, err) 170 } 171 n, err = f.Seek(f.Size(), 0) 172 if n != f.Size() || err != nil { 173 t.Errorf("seek got %d, expected %d, %v", n, f.Size(), err) 174 } 175 } 176 177 func TestReread(t *testing.T) { 178 f, err := New(small) 179 if err != nil { 180 t.Fatal(err) 181 } 182 var buf [1]byte 183 f.Seek(0, 0) 184 for i := 0; i < int(f.Size()); i++ { 185 n, err := f.Read(buf[:]) 186 if n != 1 || err != nil { 187 t.Fatalf("n=%d, err=%v", n, err) 188 } 189 } 190 stats := f.Stats() 191 if stats.Bytes != f.Size() || stats.Reads != 1 || stats.Seeks != 1 { 192 t.Errorf("%v %d %d", stats, f.(*fbuf).bufloc, f.(*fbuf).bufpos) 193 } 194 n, err := f.Read(buf[:]) 195 if n != 0 || err != io.EOF { 196 t.Fatalf("expected 0 and io.EOF, got %d %v", n, err) 197 } 198 f.Seek(0, 0) 199 xstats := f.Stats() 200 if xstats.Bytes != f.Size() || xstats.Reads != 1 || xstats.Seeks != 2 { 201 t.Errorf("%v %v %d %d", stats, xstats, f.(*fbuf).bufloc, f.(*fbuf).bufpos) 202 } 203 f.Close() 204 }