github.com/jbendotnet/noms@v0.0.0-20190904222105-c43e4293ea92/go/nbs/fs_table_cache_test.go (about) 1 // Copyright 2017 Attic Labs, Inc. All rights reserved. 2 // Licensed under the Apache License, version 2.0: 3 // http://www.apache.org/licenses/LICENSE-2.0 4 5 package nbs 6 7 import ( 8 "bytes" 9 "io" 10 "io/ioutil" 11 "os" 12 "path/filepath" 13 "sort" 14 "testing" 15 16 "github.com/stretchr/testify/assert" 17 ) 18 19 func TestFSTableCache(t *testing.T) { 20 datas := [][]byte{[]byte("hello"), []byte("world"), []byte("goodbye")} 21 sort.SliceStable(datas, func(i, j int) bool { return len(datas[i]) < len(datas[j]) }) 22 23 t.Run("ExpireLRU", func(t *testing.T) { 24 t.Parallel() 25 dir := makeTempDir(t) 26 defer os.RemoveAll(dir) 27 28 sum := 0 29 for _, s := range datas[1:] { 30 sum += len(s) 31 } 32 33 tc := newFSTableCache(dir, uint64(sum), len(datas)) 34 for _, d := range datas { 35 tc.store(computeAddr(d), bytes.NewReader(d), uint64(len(d))) 36 } 37 38 expiredName := computeAddr(datas[0]) 39 assert.Nil(t, tc.checkout(expiredName)) 40 _, fserr := os.Stat(filepath.Join(dir, expiredName.String())) 41 assert.True(t, os.IsNotExist(fserr)) 42 43 for _, d := range datas[1:] { 44 name := computeAddr(d) 45 r := tc.checkout(name) 46 assert.NotNil(t, r) 47 assertDataInReaderAt(t, d, r) 48 _, fserr := os.Stat(filepath.Join(dir, name.String())) 49 assert.False(t, os.IsNotExist(fserr)) 50 } 51 }) 52 53 t.Run("Init", func(t *testing.T) { 54 t.Run("Success", func(t *testing.T) { 55 t.Parallel() 56 dir := makeTempDir(t) 57 defer os.RemoveAll(dir) 58 assert := assert.New(t) 59 60 names := []addr{} 61 for i := byte(0); i < 4; i++ { 62 name := computeAddr([]byte{i}) 63 assert.NoError(ioutil.WriteFile(filepath.Join(dir, name.String()), nil, 0666)) 64 names = append(names, name) 65 } 66 var ftc *fsTableCache 67 assert.NotPanics(func() { ftc = newFSTableCache(dir, 1024, 4) }) 68 assert.NotNil(ftc) 69 70 for _, name := range names { 71 assert.NotNil(ftc.checkout(name)) 72 } 73 }) 74 75 t.Run("BadFile", func(t *testing.T) { 76 t.Parallel() 77 dir := makeTempDir(t) 78 defer os.RemoveAll(dir) 79 80 assert.NoError(t, ioutil.WriteFile(filepath.Join(dir, "boo"), nil, 0666)) 81 assert.Panics(t, func() { newFSTableCache(dir, 1024, 4) }) 82 }) 83 84 t.Run("ClearTempFile", func(t *testing.T) { 85 t.Parallel() 86 dir := makeTempDir(t) 87 defer os.RemoveAll(dir) 88 89 tempFile := filepath.Join(dir, tempTablePrefix+"boo") 90 assert.NoError(t, ioutil.WriteFile(tempFile, nil, 0666)) 91 assert.NotPanics(t, func() { newFSTableCache(dir, 1024, 4) }) 92 _, fserr := os.Stat(tempFile) 93 assert.True(t, os.IsNotExist(fserr)) 94 }) 95 96 t.Run("Dir", func(t *testing.T) { 97 t.Parallel() 98 dir := makeTempDir(t) 99 defer os.RemoveAll(dir) 100 assert.NoError(t, os.Mkdir(filepath.Join(dir, "sub"), 0777)) 101 assert.Panics(t, func() { newFSTableCache(dir, 1024, 4) }) 102 }) 103 }) 104 } 105 106 func assertDataInReaderAt(t *testing.T, data []byte, r io.ReaderAt) { 107 p := make([]byte, len(data)) 108 n, err := r.ReadAt(p, 0) 109 assert.NoError(t, err) 110 assert.Equal(t, len(data), n) 111 assert.Equal(t, data, p) 112 }