mount_unix_test.go 3.4 KB

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