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  }