github.com/stevegt/moby@v1.13.1/pkg/mount/mount_unix_test.go (about)

     1  // +build !windows,!solaris
     2  
     3  package mount
     4  
     5  import (
     6  	"os"
     7  	"path"
     8  	"testing"
     9  )
    10  
    11  func TestMountOptionsParsing(t *testing.T) {
    12  	options := "noatime,ro,size=10k"
    13  
    14  	flag, data := parseOptions(options)
    15  
    16  	if data != "size=10k" {
    17  		t.Fatalf("Expected size=10 got %s", data)
    18  	}
    19  
    20  	expectedFlag := NOATIME | RDONLY
    21  
    22  	if flag != expectedFlag {
    23  		t.Fatalf("Expected %d got %d", expectedFlag, flag)
    24  	}
    25  }
    26  
    27  func TestMounted(t *testing.T) {
    28  	tmp := path.Join(os.TempDir(), "mount-tests")
    29  	if err := os.MkdirAll(tmp, 0777); err != nil {
    30  		t.Fatal(err)
    31  	}
    32  	defer os.RemoveAll(tmp)
    33  
    34  	var (
    35  		sourceDir  = path.Join(tmp, "source")
    36  		targetDir  = path.Join(tmp, "target")
    37  		sourcePath = path.Join(sourceDir, "file.txt")
    38  		targetPath = path.Join(targetDir, "file.txt")
    39  	)
    40  
    41  	os.Mkdir(sourceDir, 0777)
    42  	os.Mkdir(targetDir, 0777)
    43  
    44  	f, err := os.Create(sourcePath)
    45  	if err != nil {
    46  		t.Fatal(err)
    47  	}
    48  	f.WriteString("hello")
    49  	f.Close()
    50  
    51  	f, err = os.Create(targetPath)
    52  	if err != nil {
    53  		t.Fatal(err)
    54  	}
    55  	f.Close()
    56  
    57  	if err := Mount(sourceDir, targetDir, "none", "bind,rw"); err != nil {
    58  		t.Fatal(err)
    59  	}
    60  	defer func() {
    61  		if err := Unmount(targetDir); err != nil {
    62  			t.Fatal(err)
    63  		}
    64  	}()
    65  
    66  	mounted, err := Mounted(targetDir)
    67  	if err != nil {
    68  		t.Fatal(err)
    69  	}
    70  	if !mounted {
    71  		t.Fatalf("Expected %s to be mounted", targetDir)
    72  	}
    73  	if _, err := os.Stat(targetDir); err != nil {
    74  		t.Fatal(err)
    75  	}
    76  }
    77  
    78  func TestMountReadonly(t *testing.T) {
    79  	tmp := path.Join(os.TempDir(), "mount-tests")
    80  	if err := os.MkdirAll(tmp, 0777); err != nil {
    81  		t.Fatal(err)
    82  	}
    83  	defer os.RemoveAll(tmp)
    84  
    85  	var (
    86  		sourceDir  = path.Join(tmp, "source")
    87  		targetDir  = path.Join(tmp, "target")
    88  		sourcePath = path.Join(sourceDir, "file.txt")
    89  		targetPath = path.Join(targetDir, "file.txt")
    90  	)
    91  
    92  	os.Mkdir(sourceDir, 0777)
    93  	os.Mkdir(targetDir, 0777)
    94  
    95  	f, err := os.Create(sourcePath)
    96  	if err != nil {
    97  		t.Fatal(err)
    98  	}
    99  	f.WriteString("hello")
   100  	f.Close()
   101  
   102  	f, err = os.Create(targetPath)
   103  	if err != nil {
   104  		t.Fatal(err)
   105  	}
   106  	f.Close()
   107  
   108  	if err := Mount(sourceDir, targetDir, "none", "bind,ro"); err != nil {
   109  		t.Fatal(err)
   110  	}
   111  	defer func() {
   112  		if err := Unmount(targetDir); err != nil {
   113  			t.Fatal(err)
   114  		}
   115  	}()
   116  
   117  	f, err = os.OpenFile(targetPath, os.O_RDWR, 0777)
   118  	if err == nil {
   119  		t.Fatal("Should not be able to open a ro file as rw")
   120  	}
   121  }
   122  
   123  func TestGetMounts(t *testing.T) {
   124  	mounts, err := GetMounts()
   125  	if err != nil {
   126  		t.Fatal(err)
   127  	}
   128  
   129  	root := false
   130  	for _, entry := range mounts {
   131  		if entry.Mountpoint == "/" {
   132  			root = true
   133  		}
   134  	}
   135  
   136  	if !root {
   137  		t.Fatal("/ should be mounted at least")
   138  	}
   139  }
   140  
   141  func TestMergeTmpfsOptions(t *testing.T) {
   142  	options := []string{"noatime", "ro", "size=10k", "defaults", "atime", "defaults", "rw", "rprivate", "size=1024k", "slave"}
   143  	expected := []string{"atime", "rw", "size=1024k", "slave"}
   144  	merged, err := MergeTmpfsOptions(options)
   145  	if err != nil {
   146  		t.Fatal(err)
   147  	}
   148  	if len(expected) != len(merged) {
   149  		t.Fatalf("Expected %s got %s", expected, merged)
   150  	}
   151  	for index := range merged {
   152  		if merged[index] != expected[index] {
   153  			t.Fatalf("Expected %s for the %dth option, got %s", expected, index, merged)
   154  		}
   155  	}
   156  
   157  	options = []string{"noatime", "ro", "size=10k", "atime", "rw", "rprivate", "size=1024k", "slave", "size"}
   158  	_, err = MergeTmpfsOptions(options)
   159  	if err == nil {
   160  		t.Fatal("Expected error got nil")
   161  	}
   162  }