github.com/ssdev-go/moby@v17.12.1-ce-rc2+incompatible/builder/fscache/fscache_test.go (about)

     1  package fscache
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"path/filepath"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/moby/buildkit/session/filesync"
    11  	"github.com/stretchr/testify/assert"
    12  	"golang.org/x/net/context"
    13  )
    14  
    15  func TestFSCache(t *testing.T) {
    16  	tmpDir, err := ioutil.TempDir("", "fscache")
    17  	assert.Nil(t, err)
    18  	defer os.RemoveAll(tmpDir)
    19  
    20  	backend := NewNaiveCacheBackend(filepath.Join(tmpDir, "backend"))
    21  
    22  	opt := Opt{
    23  		Root:     tmpDir,
    24  		Backend:  backend,
    25  		GCPolicy: GCPolicy{MaxSize: 15, MaxKeepDuration: time.Hour},
    26  	}
    27  
    28  	fscache, err := NewFSCache(opt)
    29  	assert.Nil(t, err)
    30  
    31  	defer fscache.Close()
    32  
    33  	err = fscache.RegisterTransport("test", &testTransport{})
    34  	assert.Nil(t, err)
    35  
    36  	src1, err := fscache.SyncFrom(context.TODO(), &testIdentifier{"foo", "data", "bar"})
    37  	assert.Nil(t, err)
    38  
    39  	dt, err := ioutil.ReadFile(filepath.Join(src1.Root().Path(), "foo"))
    40  	assert.Nil(t, err)
    41  	assert.Equal(t, string(dt), "data")
    42  
    43  	// same id doesn't recalculate anything
    44  	src2, err := fscache.SyncFrom(context.TODO(), &testIdentifier{"foo", "data2", "bar"})
    45  	assert.Nil(t, err)
    46  	assert.Equal(t, src1.Root().Path(), src2.Root().Path())
    47  
    48  	dt, err = ioutil.ReadFile(filepath.Join(src1.Root().Path(), "foo"))
    49  	assert.Nil(t, err)
    50  	assert.Equal(t, string(dt), "data")
    51  	assert.Nil(t, src2.Close())
    52  
    53  	src3, err := fscache.SyncFrom(context.TODO(), &testIdentifier{"foo2", "data2", "bar"})
    54  	assert.Nil(t, err)
    55  	assert.NotEqual(t, src1.Root().Path(), src3.Root().Path())
    56  
    57  	dt, err = ioutil.ReadFile(filepath.Join(src3.Root().Path(), "foo2"))
    58  	assert.Nil(t, err)
    59  	assert.Equal(t, string(dt), "data2")
    60  
    61  	s, err := fscache.DiskUsage()
    62  	assert.Nil(t, err)
    63  	assert.Equal(t, s, int64(0))
    64  
    65  	assert.Nil(t, src3.Close())
    66  
    67  	s, err = fscache.DiskUsage()
    68  	assert.Nil(t, err)
    69  	assert.Equal(t, s, int64(5))
    70  
    71  	// new upload with the same shared key shoutl overwrite
    72  	src4, err := fscache.SyncFrom(context.TODO(), &testIdentifier{"foo3", "data3", "bar"})
    73  	assert.Nil(t, err)
    74  	assert.NotEqual(t, src1.Root().Path(), src3.Root().Path())
    75  
    76  	dt, err = ioutil.ReadFile(filepath.Join(src3.Root().Path(), "foo3"))
    77  	assert.Nil(t, err)
    78  	assert.Equal(t, string(dt), "data3")
    79  	assert.Equal(t, src4.Root().Path(), src3.Root().Path())
    80  	assert.Nil(t, src4.Close())
    81  
    82  	s, err = fscache.DiskUsage()
    83  	assert.Nil(t, err)
    84  	assert.Equal(t, s, int64(10))
    85  
    86  	// this one goes over the GC limit
    87  	src5, err := fscache.SyncFrom(context.TODO(), &testIdentifier{"foo4", "datadata", "baz"})
    88  	assert.Nil(t, err)
    89  	assert.Nil(t, src5.Close())
    90  
    91  	// GC happens async
    92  	time.Sleep(100 * time.Millisecond)
    93  
    94  	// only last insertion after GC
    95  	s, err = fscache.DiskUsage()
    96  	assert.Nil(t, err)
    97  	assert.Equal(t, s, int64(8))
    98  
    99  	// prune deletes everything
   100  	released, err := fscache.Prune(context.TODO())
   101  	assert.Nil(t, err)
   102  	assert.Equal(t, released, uint64(8))
   103  
   104  	s, err = fscache.DiskUsage()
   105  	assert.Nil(t, err)
   106  	assert.Equal(t, s, int64(0))
   107  }
   108  
   109  type testTransport struct {
   110  }
   111  
   112  func (t *testTransport) Copy(ctx context.Context, id RemoteIdentifier, dest string, cs filesync.CacheUpdater) error {
   113  	testid := id.(*testIdentifier)
   114  	return ioutil.WriteFile(filepath.Join(dest, testid.filename), []byte(testid.data), 0600)
   115  }
   116  
   117  type testIdentifier struct {
   118  	filename  string
   119  	data      string
   120  	sharedKey string
   121  }
   122  
   123  func (t *testIdentifier) Key() string {
   124  	return t.filename
   125  }
   126  func (t *testIdentifier) SharedKey() string {
   127  	return t.sharedKey
   128  }
   129  func (t *testIdentifier) Transport() string {
   130  	return "test"
   131  }