mount_unix_test.go 3.2 KB

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