github.com/brahmaroutu/docker@v1.2.1-0.20160809185609-eb28dde01f16/volume/local/local_test.go (about)

     1  package local
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"reflect"
     7  	"runtime"
     8  	"strings"
     9  	"testing"
    10  
    11  	"github.com/docker/docker/pkg/mount"
    12  )
    13  
    14  func TestRemove(t *testing.T) {
    15  	// TODO Windows: Investigate why this test fails on Windows under CI
    16  	//               but passes locally.
    17  	if runtime.GOOS == "windows" {
    18  		t.Skip("Test failing on Windows CI")
    19  	}
    20  	rootDir, err := ioutil.TempDir("", "local-volume-test")
    21  	if err != nil {
    22  		t.Fatal(err)
    23  	}
    24  	defer os.RemoveAll(rootDir)
    25  
    26  	r, err := New(rootDir, 0, 0)
    27  	if err != nil {
    28  		t.Fatal(err)
    29  	}
    30  
    31  	vol, err := r.Create("testing", nil)
    32  	if err != nil {
    33  		t.Fatal(err)
    34  	}
    35  
    36  	if err := r.Remove(vol); err != nil {
    37  		t.Fatal(err)
    38  	}
    39  
    40  	vol, err = r.Create("testing2", nil)
    41  	if err != nil {
    42  		t.Fatal(err)
    43  	}
    44  	if err := os.RemoveAll(vol.Path()); err != nil {
    45  		t.Fatal(err)
    46  	}
    47  
    48  	if err := r.Remove(vol); err != nil {
    49  		t.Fatal(err)
    50  	}
    51  
    52  	if _, err := os.Stat(vol.Path()); err != nil && !os.IsNotExist(err) {
    53  		t.Fatal("volume dir not removed")
    54  	}
    55  
    56  	if l, _ := r.List(); len(l) != 0 {
    57  		t.Fatal("expected there to be no volumes")
    58  	}
    59  }
    60  
    61  func TestInitializeWithVolumes(t *testing.T) {
    62  	rootDir, err := ioutil.TempDir("", "local-volume-test")
    63  	if err != nil {
    64  		t.Fatal(err)
    65  	}
    66  	defer os.RemoveAll(rootDir)
    67  
    68  	r, err := New(rootDir, 0, 0)
    69  	if err != nil {
    70  		t.Fatal(err)
    71  	}
    72  
    73  	vol, err := r.Create("testing", nil)
    74  	if err != nil {
    75  		t.Fatal(err)
    76  	}
    77  
    78  	r, err = New(rootDir, 0, 0)
    79  	if err != nil {
    80  		t.Fatal(err)
    81  	}
    82  
    83  	v, err := r.Get(vol.Name())
    84  	if err != nil {
    85  		t.Fatal(err)
    86  	}
    87  
    88  	if v.Path() != vol.Path() {
    89  		t.Fatal("expected to re-initialize root with existing volumes")
    90  	}
    91  }
    92  
    93  func TestCreate(t *testing.T) {
    94  	rootDir, err := ioutil.TempDir("", "local-volume-test")
    95  	if err != nil {
    96  		t.Fatal(err)
    97  	}
    98  	defer os.RemoveAll(rootDir)
    99  
   100  	r, err := New(rootDir, 0, 0)
   101  	if err != nil {
   102  		t.Fatal(err)
   103  	}
   104  
   105  	cases := map[string]bool{
   106  		"name":                  true,
   107  		"name-with-dash":        true,
   108  		"name_with_underscore":  true,
   109  		"name/with/slash":       false,
   110  		"name/with/../../slash": false,
   111  		"./name":                false,
   112  		"../name":               false,
   113  		"./":                    false,
   114  		"../":                   false,
   115  		"~":                     false,
   116  		".":                     false,
   117  		"..":                    false,
   118  		"...":                   false,
   119  	}
   120  
   121  	for name, success := range cases {
   122  		v, err := r.Create(name, nil)
   123  		if success {
   124  			if err != nil {
   125  				t.Fatal(err)
   126  			}
   127  			if v.Name() != name {
   128  				t.Fatalf("Expected volume with name %s, got %s", name, v.Name())
   129  			}
   130  		} else {
   131  			if err == nil {
   132  				t.Fatalf("Expected error creating volume with name %s, got nil", name)
   133  			}
   134  		}
   135  	}
   136  }
   137  
   138  func TestValidateName(t *testing.T) {
   139  	r := &Root{}
   140  	names := map[string]bool{
   141  		"/testvol":    false,
   142  		"thing.d":     true,
   143  		"hello-world": true,
   144  		"./hello":     false,
   145  		".hello":      false,
   146  	}
   147  
   148  	for vol, expected := range names {
   149  		err := r.validateName(vol)
   150  		if expected && err != nil {
   151  			t.Fatalf("expected %s to be valid got %v", vol, err)
   152  		}
   153  		if !expected && err == nil {
   154  			t.Fatalf("expected %s to be invalid", vol)
   155  		}
   156  	}
   157  }
   158  
   159  func TestCreateWithOpts(t *testing.T) {
   160  	if runtime.GOOS == "windows" {
   161  		t.Skip()
   162  	}
   163  
   164  	rootDir, err := ioutil.TempDir("", "local-volume-test")
   165  	if err != nil {
   166  		t.Fatal(err)
   167  	}
   168  	defer os.RemoveAll(rootDir)
   169  
   170  	r, err := New(rootDir, 0, 0)
   171  	if err != nil {
   172  		t.Fatal(err)
   173  	}
   174  
   175  	if _, err := r.Create("test", map[string]string{"invalidopt": "notsupported"}); err == nil {
   176  		t.Fatal("expected invalid opt to cause error")
   177  	}
   178  
   179  	vol, err := r.Create("test", map[string]string{"device": "tmpfs", "type": "tmpfs", "o": "size=1m,uid=1000"})
   180  	if err != nil {
   181  		t.Fatal(err)
   182  	}
   183  	v := vol.(*localVolume)
   184  
   185  	dir, err := v.Mount("1234")
   186  	if err != nil {
   187  		t.Fatal(err)
   188  	}
   189  	defer func() {
   190  		if err := v.Unmount("1234"); err != nil {
   191  			t.Fatal(err)
   192  		}
   193  	}()
   194  
   195  	mountInfos, err := mount.GetMounts()
   196  	if err != nil {
   197  		t.Fatal(err)
   198  	}
   199  
   200  	var found bool
   201  	for _, info := range mountInfos {
   202  		if info.Mountpoint == dir {
   203  			found = true
   204  			if info.Fstype != "tmpfs" {
   205  				t.Fatalf("expected tmpfs mount, got %q", info.Fstype)
   206  			}
   207  			if info.Source != "tmpfs" {
   208  				t.Fatalf("expected tmpfs mount, got %q", info.Source)
   209  			}
   210  			if !strings.Contains(info.VfsOpts, "uid=1000") {
   211  				t.Fatalf("expected mount info to have uid=1000: %q", info.VfsOpts)
   212  			}
   213  			if !strings.Contains(info.VfsOpts, "size=1024k") {
   214  				t.Fatalf("expected mount info to have size=1024k: %q", info.VfsOpts)
   215  			}
   216  			break
   217  		}
   218  	}
   219  
   220  	if !found {
   221  		t.Fatal("mount not found")
   222  	}
   223  
   224  	if v.active.count != 1 {
   225  		t.Fatalf("Expected active mount count to be 1, got %d", v.active.count)
   226  	}
   227  
   228  	// test double mount
   229  	if _, err := v.Mount("1234"); err != nil {
   230  		t.Fatal(err)
   231  	}
   232  	if v.active.count != 2 {
   233  		t.Fatalf("Expected active mount count to be 2, got %d", v.active.count)
   234  	}
   235  
   236  	if err := v.Unmount("1234"); err != nil {
   237  		t.Fatal(err)
   238  	}
   239  	if v.active.count != 1 {
   240  		t.Fatalf("Expected active mount count to be 1, got %d", v.active.count)
   241  	}
   242  
   243  	mounted, err := mount.Mounted(v.path)
   244  	if err != nil {
   245  		t.Fatal(err)
   246  	}
   247  	if !mounted {
   248  		t.Fatal("expected mount to still be active")
   249  	}
   250  
   251  	r, err = New(rootDir, 0, 0)
   252  	if err != nil {
   253  		t.Fatal(err)
   254  	}
   255  
   256  	v2, exists := r.volumes["test"]
   257  	if !exists {
   258  		t.Fatal("missing volume on restart")
   259  	}
   260  
   261  	if !reflect.DeepEqual(v.opts, v2.opts) {
   262  		t.Fatal("missing volume options on restart")
   263  	}
   264  }