Tizen_4.0 base
[platform/upstream/docker-engine.git] / builder / fscache / fscache_test.go
1 package fscache
2
3 import (
4         "io/ioutil"
5         "os"
6         "path/filepath"
7         "testing"
8         "time"
9
10         "github.com/docker/docker/client/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(), "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(), src2.Root())
47
48         dt, err = ioutil.ReadFile(filepath.Join(src1.Root(), "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(), src3.Root())
56
57         dt, err = ioutil.ReadFile(filepath.Join(src3.Root(), "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(), src3.Root())
75
76         dt, err = ioutil.ReadFile(filepath.Join(src3.Root(), "foo3"))
77         assert.Nil(t, err)
78         assert.Equal(t, string(dt), "data3")
79         assert.Equal(t, src4.Root(), src3.Root())
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()
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 }