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 }