Tizen_4.0 base
[platform/upstream/docker-engine.git] / volume / store / store_test.go
1 package store
2
3 import (
4         "errors"
5         "io/ioutil"
6         "os"
7         "strings"
8         "testing"
9
10         "github.com/docker/docker/volume/drivers"
11         volumetestutils "github.com/docker/docker/volume/testutils"
12 )
13
14 func TestCreate(t *testing.T) {
15         volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
16         defer volumedrivers.Unregister("fake")
17         dir, err := ioutil.TempDir("", "test-create")
18         if err != nil {
19                 t.Fatal(err)
20         }
21         defer os.RemoveAll(dir)
22
23         s, err := New(dir)
24         if err != nil {
25                 t.Fatal(err)
26         }
27         v, err := s.Create("fake1", "fake", nil, nil)
28         if err != nil {
29                 t.Fatal(err)
30         }
31         if v.Name() != "fake1" {
32                 t.Fatalf("Expected fake1 volume, got %v", v)
33         }
34         if l, _, _ := s.List(); len(l) != 1 {
35                 t.Fatalf("Expected 1 volume in the store, got %v: %v", len(l), l)
36         }
37
38         if _, err := s.Create("none", "none", nil, nil); err == nil {
39                 t.Fatalf("Expected unknown driver error, got nil")
40         }
41
42         _, err = s.Create("fakeerror", "fake", map[string]string{"error": "create error"}, nil)
43         expected := &OpErr{Op: "create", Name: "fakeerror", Err: errors.New("create error")}
44         if err != nil && err.Error() != expected.Error() {
45                 t.Fatalf("Expected create fakeError: create error, got %v", err)
46         }
47 }
48
49 func TestRemove(t *testing.T) {
50         volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
51         volumedrivers.Register(volumetestutils.NewFakeDriver("noop"), "noop")
52         defer volumedrivers.Unregister("fake")
53         defer volumedrivers.Unregister("noop")
54         dir, err := ioutil.TempDir("", "test-remove")
55         if err != nil {
56                 t.Fatal(err)
57         }
58         defer os.RemoveAll(dir)
59         s, err := New(dir)
60         if err != nil {
61                 t.Fatal(err)
62         }
63
64         // doing string compare here since this error comes directly from the driver
65         expected := "no such volume"
66         if err := s.Remove(volumetestutils.NoopVolume{}); err == nil || !strings.Contains(err.Error(), expected) {
67                 t.Fatalf("Expected error %q, got %v", expected, err)
68         }
69
70         v, err := s.CreateWithRef("fake1", "fake", "fake", nil, nil)
71         if err != nil {
72                 t.Fatal(err)
73         }
74
75         if err := s.Remove(v); !IsInUse(err) {
76                 t.Fatalf("Expected ErrVolumeInUse error, got %v", err)
77         }
78         s.Dereference(v, "fake")
79         if err := s.Remove(v); err != nil {
80                 t.Fatal(err)
81         }
82         if l, _, _ := s.List(); len(l) != 0 {
83                 t.Fatalf("Expected 0 volumes in the store, got %v, %v", len(l), l)
84         }
85 }
86
87 func TestList(t *testing.T) {
88         volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
89         volumedrivers.Register(volumetestutils.NewFakeDriver("fake2"), "fake2")
90         defer volumedrivers.Unregister("fake")
91         defer volumedrivers.Unregister("fake2")
92         dir, err := ioutil.TempDir("", "test-list")
93         if err != nil {
94                 t.Fatal(err)
95         }
96         defer os.RemoveAll(dir)
97
98         s, err := New(dir)
99         if err != nil {
100                 t.Fatal(err)
101         }
102         if _, err := s.Create("test", "fake", nil, nil); err != nil {
103                 t.Fatal(err)
104         }
105         if _, err := s.Create("test2", "fake2", nil, nil); err != nil {
106                 t.Fatal(err)
107         }
108
109         ls, _, err := s.List()
110         if err != nil {
111                 t.Fatal(err)
112         }
113         if len(ls) != 2 {
114                 t.Fatalf("expected 2 volumes, got: %d", len(ls))
115         }
116         if err := s.Shutdown(); err != nil {
117                 t.Fatal(err)
118         }
119
120         // and again with a new store
121         s, err = New(dir)
122         if err != nil {
123                 t.Fatal(err)
124         }
125         ls, _, err = s.List()
126         if err != nil {
127                 t.Fatal(err)
128         }
129         if len(ls) != 2 {
130                 t.Fatalf("expected 2 volumes, got: %d", len(ls))
131         }
132 }
133
134 func TestFilterByDriver(t *testing.T) {
135         volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
136         volumedrivers.Register(volumetestutils.NewFakeDriver("noop"), "noop")
137         defer volumedrivers.Unregister("fake")
138         defer volumedrivers.Unregister("noop")
139         dir, err := ioutil.TempDir("", "test-filter-driver")
140         if err != nil {
141                 t.Fatal(err)
142         }
143         s, err := New(dir)
144         if err != nil {
145                 t.Fatal(err)
146         }
147
148         if _, err := s.Create("fake1", "fake", nil, nil); err != nil {
149                 t.Fatal(err)
150         }
151         if _, err := s.Create("fake2", "fake", nil, nil); err != nil {
152                 t.Fatal(err)
153         }
154         if _, err := s.Create("fake3", "noop", nil, nil); err != nil {
155                 t.Fatal(err)
156         }
157
158         if l, _ := s.FilterByDriver("fake"); len(l) != 2 {
159                 t.Fatalf("Expected 2 volumes, got %v, %v", len(l), l)
160         }
161
162         if l, _ := s.FilterByDriver("noop"); len(l) != 1 {
163                 t.Fatalf("Expected 1 volume, got %v, %v", len(l), l)
164         }
165 }
166
167 func TestFilterByUsed(t *testing.T) {
168         volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
169         volumedrivers.Register(volumetestutils.NewFakeDriver("noop"), "noop")
170         dir, err := ioutil.TempDir("", "test-filter-used")
171         if err != nil {
172                 t.Fatal(err)
173         }
174
175         s, err := New(dir)
176         if err != nil {
177                 t.Fatal(err)
178         }
179
180         if _, err := s.CreateWithRef("fake1", "fake", "volReference", nil, nil); err != nil {
181                 t.Fatal(err)
182         }
183         if _, err := s.Create("fake2", "fake", nil, nil); err != nil {
184                 t.Fatal(err)
185         }
186
187         vols, _, err := s.List()
188         if err != nil {
189                 t.Fatal(err)
190         }
191
192         dangling := s.FilterByUsed(vols, false)
193         if len(dangling) != 1 {
194                 t.Fatalf("expected 1 dangling volume, got %v", len(dangling))
195         }
196         if dangling[0].Name() != "fake2" {
197                 t.Fatalf("expected dangling volume fake2, got %s", dangling[0].Name())
198         }
199
200         used := s.FilterByUsed(vols, true)
201         if len(used) != 1 {
202                 t.Fatalf("expected 1 used volume, got %v", len(used))
203         }
204         if used[0].Name() != "fake1" {
205                 t.Fatalf("expected used volume fake1, got %s", used[0].Name())
206         }
207 }
208
209 func TestDerefMultipleOfSameRef(t *testing.T) {
210         volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake")
211         dir, err := ioutil.TempDir("", "test-same-deref")
212         if err != nil {
213                 t.Fatal(err)
214         }
215         defer os.RemoveAll(dir)
216         s, err := New(dir)
217         if err != nil {
218                 t.Fatal(err)
219         }
220
221         v, err := s.CreateWithRef("fake1", "fake", "volReference", nil, nil)
222         if err != nil {
223                 t.Fatal(err)
224         }
225
226         if _, err := s.GetWithRef("fake1", "fake", "volReference"); err != nil {
227                 t.Fatal(err)
228         }
229
230         s.Dereference(v, "volReference")
231         if err := s.Remove(v); err != nil {
232                 t.Fatal(err)
233         }
234 }