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  }