github.com/rita33cool1/iot-system-gateway@v0.0.0-20200911033302-e65bde238cc5/docker-engine/volume/store/store_test.go (about) 1 package store // import "github.com/docker/docker/volume/store" 2 3 import ( 4 "errors" 5 "fmt" 6 "io/ioutil" 7 "net" 8 "os" 9 "strings" 10 "testing" 11 12 "github.com/docker/docker/volume" 13 "github.com/docker/docker/volume/drivers" 14 volumetestutils "github.com/docker/docker/volume/testutils" 15 "github.com/google/go-cmp/cmp" 16 "github.com/gotestyourself/gotestyourself/assert" 17 is "github.com/gotestyourself/gotestyourself/assert/cmp" 18 ) 19 20 func TestCreate(t *testing.T) { 21 volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake") 22 defer volumedrivers.Unregister("fake") 23 dir, err := ioutil.TempDir("", "test-create") 24 if err != nil { 25 t.Fatal(err) 26 } 27 defer os.RemoveAll(dir) 28 29 s, err := New(dir) 30 if err != nil { 31 t.Fatal(err) 32 } 33 v, err := s.Create("fake1", "fake", nil, nil) 34 if err != nil { 35 t.Fatal(err) 36 } 37 if v.Name() != "fake1" { 38 t.Fatalf("Expected fake1 volume, got %v", v) 39 } 40 if l, _, _ := s.List(); len(l) != 1 { 41 t.Fatalf("Expected 1 volume in the store, got %v: %v", len(l), l) 42 } 43 44 if _, err := s.Create("none", "none", nil, nil); err == nil { 45 t.Fatalf("Expected unknown driver error, got nil") 46 } 47 48 _, err = s.Create("fakeerror", "fake", map[string]string{"error": "create error"}, nil) 49 expected := &OpErr{Op: "create", Name: "fakeerror", Err: errors.New("create error")} 50 if err != nil && err.Error() != expected.Error() { 51 t.Fatalf("Expected create fakeError: create error, got %v", err) 52 } 53 } 54 55 func TestRemove(t *testing.T) { 56 volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake") 57 volumedrivers.Register(volumetestutils.NewFakeDriver("noop"), "noop") 58 defer volumedrivers.Unregister("fake") 59 defer volumedrivers.Unregister("noop") 60 dir, err := ioutil.TempDir("", "test-remove") 61 if err != nil { 62 t.Fatal(err) 63 } 64 defer os.RemoveAll(dir) 65 s, err := New(dir) 66 if err != nil { 67 t.Fatal(err) 68 } 69 70 // doing string compare here since this error comes directly from the driver 71 expected := "no such volume" 72 if err := s.Remove(volumetestutils.NoopVolume{}); err == nil || !strings.Contains(err.Error(), expected) { 73 t.Fatalf("Expected error %q, got %v", expected, err) 74 } 75 76 v, err := s.CreateWithRef("fake1", "fake", "fake", nil, nil) 77 if err != nil { 78 t.Fatal(err) 79 } 80 81 if err := s.Remove(v); !IsInUse(err) { 82 t.Fatalf("Expected ErrVolumeInUse error, got %v", err) 83 } 84 s.Dereference(v, "fake") 85 if err := s.Remove(v); err != nil { 86 t.Fatal(err) 87 } 88 if l, _, _ := s.List(); len(l) != 0 { 89 t.Fatalf("Expected 0 volumes in the store, got %v, %v", len(l), l) 90 } 91 } 92 93 func TestList(t *testing.T) { 94 volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake") 95 volumedrivers.Register(volumetestutils.NewFakeDriver("fake2"), "fake2") 96 defer volumedrivers.Unregister("fake") 97 defer volumedrivers.Unregister("fake2") 98 dir, err := ioutil.TempDir("", "test-list") 99 if err != nil { 100 t.Fatal(err) 101 } 102 defer os.RemoveAll(dir) 103 104 s, err := New(dir) 105 if err != nil { 106 t.Fatal(err) 107 } 108 if _, err := s.Create("test", "fake", nil, nil); err != nil { 109 t.Fatal(err) 110 } 111 if _, err := s.Create("test2", "fake2", nil, nil); err != nil { 112 t.Fatal(err) 113 } 114 115 ls, _, err := s.List() 116 if err != nil { 117 t.Fatal(err) 118 } 119 if len(ls) != 2 { 120 t.Fatalf("expected 2 volumes, got: %d", len(ls)) 121 } 122 if err := s.Shutdown(); err != nil { 123 t.Fatal(err) 124 } 125 126 // and again with a new store 127 s, err = New(dir) 128 if err != nil { 129 t.Fatal(err) 130 } 131 ls, _, err = s.List() 132 if err != nil { 133 t.Fatal(err) 134 } 135 if len(ls) != 2 { 136 t.Fatalf("expected 2 volumes, got: %d", len(ls)) 137 } 138 } 139 140 func TestFilterByDriver(t *testing.T) { 141 volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake") 142 volumedrivers.Register(volumetestutils.NewFakeDriver("noop"), "noop") 143 defer volumedrivers.Unregister("fake") 144 defer volumedrivers.Unregister("noop") 145 dir, err := ioutil.TempDir("", "test-filter-driver") 146 if err != nil { 147 t.Fatal(err) 148 } 149 s, err := New(dir) 150 if err != nil { 151 t.Fatal(err) 152 } 153 154 if _, err := s.Create("fake1", "fake", nil, nil); err != nil { 155 t.Fatal(err) 156 } 157 if _, err := s.Create("fake2", "fake", nil, nil); err != nil { 158 t.Fatal(err) 159 } 160 if _, err := s.Create("fake3", "noop", nil, nil); err != nil { 161 t.Fatal(err) 162 } 163 164 if l, _ := s.FilterByDriver("fake"); len(l) != 2 { 165 t.Fatalf("Expected 2 volumes, got %v, %v", len(l), l) 166 } 167 168 if l, _ := s.FilterByDriver("noop"); len(l) != 1 { 169 t.Fatalf("Expected 1 volume, got %v, %v", len(l), l) 170 } 171 } 172 173 func TestFilterByUsed(t *testing.T) { 174 volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake") 175 volumedrivers.Register(volumetestutils.NewFakeDriver("noop"), "noop") 176 dir, err := ioutil.TempDir("", "test-filter-used") 177 if err != nil { 178 t.Fatal(err) 179 } 180 181 s, err := New(dir) 182 if err != nil { 183 t.Fatal(err) 184 } 185 186 if _, err := s.CreateWithRef("fake1", "fake", "volReference", nil, nil); err != nil { 187 t.Fatal(err) 188 } 189 if _, err := s.Create("fake2", "fake", nil, nil); err != nil { 190 t.Fatal(err) 191 } 192 193 vols, _, err := s.List() 194 if err != nil { 195 t.Fatal(err) 196 } 197 198 dangling := s.FilterByUsed(vols, false) 199 if len(dangling) != 1 { 200 t.Fatalf("expected 1 dangling volume, got %v", len(dangling)) 201 } 202 if dangling[0].Name() != "fake2" { 203 t.Fatalf("expected dangling volume fake2, got %s", dangling[0].Name()) 204 } 205 206 used := s.FilterByUsed(vols, true) 207 if len(used) != 1 { 208 t.Fatalf("expected 1 used volume, got %v", len(used)) 209 } 210 if used[0].Name() != "fake1" { 211 t.Fatalf("expected used volume fake1, got %s", used[0].Name()) 212 } 213 } 214 215 func TestDerefMultipleOfSameRef(t *testing.T) { 216 volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake") 217 dir, err := ioutil.TempDir("", "test-same-deref") 218 if err != nil { 219 t.Fatal(err) 220 } 221 defer os.RemoveAll(dir) 222 s, err := New(dir) 223 if err != nil { 224 t.Fatal(err) 225 } 226 227 v, err := s.CreateWithRef("fake1", "fake", "volReference", nil, nil) 228 if err != nil { 229 t.Fatal(err) 230 } 231 232 if _, err := s.GetWithRef("fake1", "fake", "volReference"); err != nil { 233 t.Fatal(err) 234 } 235 236 s.Dereference(v, "volReference") 237 if err := s.Remove(v); err != nil { 238 t.Fatal(err) 239 } 240 } 241 242 func TestCreateKeepOptsLabelsWhenExistsRemotely(t *testing.T) { 243 vd := volumetestutils.NewFakeDriver("fake") 244 volumedrivers.Register(vd, "fake") 245 dir, err := ioutil.TempDir("", "test-same-deref") 246 if err != nil { 247 t.Fatal(err) 248 } 249 defer os.RemoveAll(dir) 250 s, err := New(dir) 251 if err != nil { 252 t.Fatal(err) 253 } 254 255 // Create a volume in the driver directly 256 if _, err := vd.Create("foo", nil); err != nil { 257 t.Fatal(err) 258 } 259 260 v, err := s.Create("foo", "fake", nil, map[string]string{"hello": "world"}) 261 if err != nil { 262 t.Fatal(err) 263 } 264 265 switch dv := v.(type) { 266 case volume.DetailedVolume: 267 if dv.Labels()["hello"] != "world" { 268 t.Fatalf("labels don't match") 269 } 270 default: 271 t.Fatalf("got unexpected type: %T", v) 272 } 273 } 274 275 func TestDefererencePluginOnCreateError(t *testing.T) { 276 var ( 277 l net.Listener 278 err error 279 ) 280 281 for i := 32768; l == nil && i < 40000; i++ { 282 l, err = net.Listen("tcp", fmt.Sprintf("127.0.0.1:%d", i)) 283 } 284 if l == nil { 285 t.Fatalf("could not create listener: %v", err) 286 } 287 defer l.Close() 288 289 d := volumetestutils.NewFakeDriver("TestDefererencePluginOnCreateError") 290 p, err := volumetestutils.MakeFakePlugin(d, l) 291 if err != nil { 292 t.Fatal(err) 293 } 294 295 pg := volumetestutils.NewFakePluginGetter(p) 296 volumedrivers.RegisterPluginGetter(pg) 297 defer volumedrivers.RegisterPluginGetter(nil) 298 299 dir, err := ioutil.TempDir("", "test-plugin-deref-err") 300 if err != nil { 301 t.Fatal(err) 302 } 303 defer os.RemoveAll(dir) 304 305 s, err := New(dir) 306 if err != nil { 307 t.Fatal(err) 308 } 309 310 // create a good volume so we have a plugin reference 311 _, err = s.Create("fake1", d.Name(), nil, nil) 312 if err != nil { 313 t.Fatal(err) 314 } 315 316 // Now create another one expecting an error 317 _, err = s.Create("fake2", d.Name(), map[string]string{"error": "some error"}, nil) 318 if err == nil || !strings.Contains(err.Error(), "some error") { 319 t.Fatalf("expected an error on create: %v", err) 320 } 321 322 // There should be only 1 plugin reference 323 if refs := volumetestutils.FakeRefs(p); refs != 1 { 324 t.Fatalf("expected 1 plugin reference, got: %d", refs) 325 } 326 } 327 328 func TestRefDerefRemove(t *testing.T) { 329 t.Parallel() 330 331 driverName := "test-ref-deref-remove" 332 s, cleanup := setupTest(t, driverName) 333 defer cleanup(t) 334 335 v, err := s.CreateWithRef("test", driverName, "test-ref", nil, nil) 336 assert.NilError(t, err) 337 338 err = s.Remove(v) 339 assert.Assert(t, is.ErrorContains(err, "")) 340 assert.Equal(t, errVolumeInUse, err.(*OpErr).Err) 341 342 s.Dereference(v, "test-ref") 343 err = s.Remove(v) 344 assert.NilError(t, err) 345 } 346 347 func TestGet(t *testing.T) { 348 t.Parallel() 349 350 driverName := "test-get" 351 s, cleanup := setupTest(t, driverName) 352 defer cleanup(t) 353 354 _, err := s.Get("not-exist") 355 assert.Assert(t, is.ErrorContains(err, "")) 356 assert.Equal(t, errNoSuchVolume, err.(*OpErr).Err) 357 358 v1, err := s.Create("test", driverName, nil, map[string]string{"a": "1"}) 359 assert.NilError(t, err) 360 361 v2, err := s.Get("test") 362 assert.NilError(t, err) 363 assert.DeepEqual(t, v1, v2, cmpVolume) 364 365 dv := v2.(volume.DetailedVolume) 366 assert.Equal(t, "1", dv.Labels()["a"]) 367 368 err = s.Remove(v1) 369 assert.NilError(t, err) 370 } 371 372 func TestGetWithRef(t *testing.T) { 373 t.Parallel() 374 375 driverName := "test-get-with-ref" 376 s, cleanup := setupTest(t, driverName) 377 defer cleanup(t) 378 379 _, err := s.GetWithRef("not-exist", driverName, "test-ref") 380 assert.Assert(t, is.ErrorContains(err, "")) 381 382 v1, err := s.Create("test", driverName, nil, map[string]string{"a": "1"}) 383 assert.NilError(t, err) 384 385 v2, err := s.GetWithRef("test", driverName, "test-ref") 386 assert.NilError(t, err) 387 assert.DeepEqual(t, v1, v2, cmpVolume) 388 389 err = s.Remove(v2) 390 assert.Assert(t, is.ErrorContains(err, "")) 391 assert.Equal(t, errVolumeInUse, err.(*OpErr).Err) 392 393 s.Dereference(v2, "test-ref") 394 err = s.Remove(v2) 395 assert.NilError(t, err) 396 } 397 398 var cmpVolume = cmp.AllowUnexported(volumetestutils.FakeVolume{}, volumeWrapper{}) 399 400 func setupTest(t *testing.T, name string) (*VolumeStore, func(*testing.T)) { 401 t.Helper() 402 s, cleanup := newTestStore(t) 403 404 volumedrivers.Register(volumetestutils.NewFakeDriver(name), name) 405 return s, func(t *testing.T) { 406 cleanup(t) 407 volumedrivers.Unregister(name) 408 } 409 } 410 411 func newTestStore(t *testing.T) (*VolumeStore, func(*testing.T)) { 412 t.Helper() 413 414 dir, err := ioutil.TempDir("", "store-root") 415 assert.NilError(t, err) 416 417 cleanup := func(t *testing.T) { 418 err := os.RemoveAll(dir) 419 assert.Check(t, err) 420 } 421 422 s, err := New(dir) 423 assert.Check(t, err) 424 return s, func(t *testing.T) { 425 s.Shutdown() 426 cleanup(t) 427 } 428 }