github.com/goproxy0/go@v0.0.0-20171111080102-49cc0c489d2c/src/cmd/go/internal/cache/cache_test.go (about)

     1  // Copyright 2017 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 cache
     6  
     7  import (
     8  	"encoding/binary"
     9  	"io/ioutil"
    10  	"os"
    11  	"path/filepath"
    12  	"testing"
    13  	"time"
    14  )
    15  
    16  func init() {
    17  	verify = false // even if GODEBUG is set
    18  }
    19  
    20  func TestBasic(t *testing.T) {
    21  	dir, err := ioutil.TempDir("", "cachetest-")
    22  	if err != nil {
    23  		t.Fatal(err)
    24  	}
    25  	defer os.RemoveAll(dir)
    26  	_, err = Open(filepath.Join(dir, "notexist"))
    27  	if err == nil {
    28  		t.Fatal(`Open("tmp/notexist") succeeded, want failure`)
    29  	}
    30  
    31  	cdir := filepath.Join(dir, "c1")
    32  	if err := os.Mkdir(cdir, 0777); err != nil {
    33  		t.Fatal(err)
    34  	}
    35  
    36  	c1, err := Open(cdir)
    37  	if err != nil {
    38  		t.Fatalf("Open(c1) (create): %v", err)
    39  	}
    40  	if err := c1.putIndexEntry(dummyID(1), dummyID(12), 13, true); err != nil {
    41  		t.Fatalf("addIndexEntry: %v", err)
    42  	}
    43  	if err := c1.putIndexEntry(dummyID(1), dummyID(2), 3, true); err != nil { // overwrite entry
    44  		t.Fatalf("addIndexEntry: %v", err)
    45  	}
    46  	if out, size, err := c1.Get(dummyID(1)); err != nil || out != dummyID(2) || size != 3 {
    47  		t.Fatalf("c1.Get(1) = %x, %v, %v, want %x, %v, nil", out[:], size, err, dummyID(2), 3)
    48  	}
    49  
    50  	c2, err := Open(cdir)
    51  	if err != nil {
    52  		t.Fatalf("Open(c2) (reuse): %v", err)
    53  	}
    54  	if out, size, err := c2.Get(dummyID(1)); err != nil || out != dummyID(2) || size != 3 {
    55  		t.Fatalf("c2.Get(1) = %x, %v, %v, want %x, %v, nil", out[:], size, err, dummyID(2), 3)
    56  	}
    57  	if err := c2.putIndexEntry(dummyID(2), dummyID(3), 4, true); err != nil {
    58  		t.Fatalf("addIndexEntry: %v", err)
    59  	}
    60  	if out, size, err := c1.Get(dummyID(2)); err != nil || out != dummyID(3) || size != 4 {
    61  		t.Fatalf("c1.Get(2) = %x, %v, %v, want %x, %v, nil", out[:], size, err, dummyID(3), 4)
    62  	}
    63  }
    64  
    65  func TestGrowth(t *testing.T) {
    66  	dir, err := ioutil.TempDir("", "cachetest-")
    67  	if err != nil {
    68  		t.Fatal(err)
    69  	}
    70  	defer os.RemoveAll(dir)
    71  
    72  	c, err := Open(dir)
    73  	if err != nil {
    74  		t.Fatalf("Open: %v", err)
    75  	}
    76  
    77  	n := 10000
    78  	if testing.Short() {
    79  		n = 1000
    80  	}
    81  
    82  	for i := 0; i < n; i++ {
    83  		if err := c.putIndexEntry(dummyID(i), dummyID(i*99), int64(i)*101, true); err != nil {
    84  			t.Fatalf("addIndexEntry: %v", err)
    85  		}
    86  		id := ActionID(dummyID(i))
    87  		out, size, err := c.Get(id)
    88  		if err != nil {
    89  			t.Fatalf("Get(%x): %v", id, err)
    90  		}
    91  		if out != dummyID(i*99) || size != int64(i)*101 {
    92  			t.Errorf("Get(%x) = %x, %d, want %x, %d", id, out, size, dummyID(i*99), int64(i)*101)
    93  		}
    94  	}
    95  	for i := 0; i < n; i++ {
    96  		id := ActionID(dummyID(i))
    97  		out, size, err := c.Get(id)
    98  		if err != nil {
    99  			t.Fatalf("Get2(%x): %v", id, err)
   100  		}
   101  		if out != dummyID(i*99) || size != int64(i)*101 {
   102  			t.Errorf("Get2(%x) = %x, %d, want %x, %d", id, out, size, dummyID(i*99), int64(i)*101)
   103  		}
   104  	}
   105  }
   106  
   107  func TestVerifyPanic(t *testing.T) {
   108  	os.Setenv("GODEBUG", "gocacheverify=1")
   109  	initEnv()
   110  	defer func() {
   111  		os.Unsetenv("GODEBUG")
   112  		verify = false
   113  	}()
   114  
   115  	if !verify {
   116  		t.Fatal("initEnv did not set verify")
   117  	}
   118  
   119  	dir, err := ioutil.TempDir("", "cachetest-")
   120  	if err != nil {
   121  		t.Fatal(err)
   122  	}
   123  	defer os.RemoveAll(dir)
   124  
   125  	c, err := Open(dir)
   126  	if err != nil {
   127  		t.Fatalf("Open: %v", err)
   128  	}
   129  
   130  	id := ActionID(dummyID(1))
   131  	if err := c.PutBytes(id, []byte("abc")); err != nil {
   132  		t.Fatal(err)
   133  	}
   134  
   135  	defer func() {
   136  		if err := recover(); err != nil {
   137  			t.Log(err)
   138  			return
   139  		}
   140  	}()
   141  	c.PutBytes(id, []byte("def"))
   142  	t.Fatal("mismatched Put did not panic in verify mode")
   143  }
   144  
   145  func TestCacheLog(t *testing.T) {
   146  	dir, err := ioutil.TempDir("", "cachetest-")
   147  	if err != nil {
   148  		t.Fatal(err)
   149  	}
   150  	defer os.RemoveAll(dir)
   151  
   152  	c, err := Open(dir)
   153  	if err != nil {
   154  		t.Fatalf("Open: %v", err)
   155  	}
   156  	c.now = func() time.Time { return time.Unix(1e9, 0) }
   157  
   158  	id := ActionID(dummyID(1))
   159  	c.Get(id)
   160  	c.PutBytes(id, []byte("abc"))
   161  	c.Get(id)
   162  
   163  	c, err = Open(dir)
   164  	if err != nil {
   165  		t.Fatalf("Open #2: %v", err)
   166  	}
   167  	c.now = func() time.Time { return time.Unix(1e9+1, 0) }
   168  	c.Get(id)
   169  
   170  	id2 := ActionID(dummyID(2))
   171  	c.Get(id2)
   172  	c.PutBytes(id2, []byte("abc"))
   173  	c.Get(id2)
   174  	c.Get(id)
   175  
   176  	data, err := ioutil.ReadFile(filepath.Join(dir, "log.txt"))
   177  	if err != nil {
   178  		t.Fatal(err)
   179  	}
   180  	want := `1000000000 miss 0100000000000000000000000000000000000000000000000000000000000000
   181  1000000000 put 0100000000000000000000000000000000000000000000000000000000000000 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad 3
   182  1000000000 get 0100000000000000000000000000000000000000000000000000000000000000
   183  1000000001 get 0100000000000000000000000000000000000000000000000000000000000000
   184  1000000001 miss 0200000000000000000000000000000000000000000000000000000000000000
   185  1000000001 put 0200000000000000000000000000000000000000000000000000000000000000 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad 3
   186  1000000001 get 0200000000000000000000000000000000000000000000000000000000000000
   187  1000000001 get 0100000000000000000000000000000000000000000000000000000000000000
   188  `
   189  	if string(data) != want {
   190  		t.Fatalf("log:\n%s\nwant:\n%s", string(data), want)
   191  	}
   192  }
   193  
   194  func dummyID(x int) [HashSize]byte {
   195  	var out [HashSize]byte
   196  	binary.LittleEndian.PutUint64(out[:], uint64(x))
   197  	return out
   198  }