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  }