filesystem_test.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. package docker
  2. import (
  3. "bytes"
  4. "io/ioutil"
  5. "os"
  6. "path"
  7. "testing"
  8. )
  9. func newTestFilesystem(t *testing.T, layers []string) (rootfs string, fs *Filesystem) {
  10. rootfs, err := ioutil.TempDir("", "docker-test-root")
  11. if err != nil {
  12. t.Fatal(err)
  13. }
  14. rwpath, err := ioutil.TempDir("", "docker-test-rw")
  15. if err != nil {
  16. t.Fatal(err)
  17. }
  18. fs = newFilesystem(rootfs, rwpath, layers)
  19. return
  20. }
  21. func TestFilesystem(t *testing.T) {
  22. _, filesystem := newTestFilesystem(t, []string{"/var/lib/docker/images/ubuntu"})
  23. if err := filesystem.Umount(); err == nil {
  24. t.Errorf("Umount succeeded even though the filesystem was not mounted")
  25. }
  26. if filesystem.IsMounted() {
  27. t.Fatal("Filesystem should not be mounted")
  28. }
  29. if err := filesystem.Mount(); err != nil {
  30. t.Fatal(err)
  31. }
  32. if !filesystem.IsMounted() {
  33. t.Fatal("Filesystem should be mounted")
  34. }
  35. if err := filesystem.Mount(); err == nil {
  36. t.Errorf("Double mount succeeded")
  37. }
  38. if !filesystem.IsMounted() {
  39. t.Fatal("Filesystem should be mounted")
  40. }
  41. if err := filesystem.Umount(); err != nil {
  42. t.Fatal(err)
  43. }
  44. if filesystem.IsMounted() {
  45. t.Fatal("Filesystem should not be mounted")
  46. }
  47. if err := filesystem.Umount(); err == nil {
  48. t.Errorf("Umount succeeded even though the filesystem was already umounted")
  49. }
  50. if filesystem.IsMounted() {
  51. t.Fatal("Filesystem should not be mounted")
  52. }
  53. }
  54. func TestFilesystemMultiLayer(t *testing.T) {
  55. // Create a fake layer
  56. fakeLayer, err := ioutil.TempDir("", "docker-layer")
  57. if err != nil {
  58. t.Fatal(err)
  59. }
  60. data := []byte("hello world")
  61. if err := ioutil.WriteFile(path.Join(fakeLayer, "test_file"), data, 0700); err != nil {
  62. t.Fatal(err)
  63. }
  64. // Create the layered filesystem and add our fake layer on top
  65. rootfs, filesystem := newTestFilesystem(t, []string{"/var/lib/docker/images/ubuntu", fakeLayer})
  66. // Mount it
  67. if err := filesystem.Mount(); err != nil {
  68. t.Fatal(err)
  69. }
  70. defer func() {
  71. if err := filesystem.Umount(); err != nil {
  72. t.Fatal(err)
  73. }
  74. }()
  75. // Check to see whether we can access our fake layer
  76. if _, err := os.Stat(path.Join(rootfs, "test_file")); err != nil {
  77. t.Fatal(err)
  78. }
  79. fsdata, err := ioutil.ReadFile(path.Join(rootfs, "test_file"))
  80. if err != nil {
  81. t.Fatal(err)
  82. }
  83. if !bytes.Equal(data, fsdata) {
  84. t.Error(string(fsdata))
  85. }
  86. }
  87. func TestChanges(t *testing.T) {
  88. rootfs, filesystem := newTestFilesystem(t, []string{"/var/lib/docker/images/ubuntu"})
  89. // Mount it
  90. if err := filesystem.Mount(); err != nil {
  91. t.Fatal(err)
  92. }
  93. defer filesystem.Umount()
  94. var changes []Change
  95. var err error
  96. // Test without changes
  97. changes, err = filesystem.Changes()
  98. if err != nil {
  99. t.Fatal(err)
  100. }
  101. if len(changes) != 0 {
  102. t.Errorf("Unexpected changes :%v", changes)
  103. }
  104. // Test simple change
  105. file, err := os.Create(path.Join(rootfs, "test_change"))
  106. if err != nil {
  107. t.Fatal(err)
  108. }
  109. file.Close()
  110. changes, err = filesystem.Changes()
  111. if err != nil {
  112. t.Fatal(err)
  113. }
  114. if len(changes) != 1 {
  115. t.Errorf("Unexpected changes :%v", changes)
  116. }
  117. if changes[0].Path != "/test_change" || changes[0].Kind != ChangeAdd {
  118. t.Errorf("Unexpected changes :%v", changes)
  119. }
  120. // Test subdirectory change
  121. if err := os.Mkdir(path.Join(rootfs, "sub_change"), 0700); err != nil {
  122. t.Fatal(err)
  123. }
  124. file, err = os.Create(path.Join(rootfs, "sub_change", "test"))
  125. if err != nil {
  126. t.Fatal(err)
  127. }
  128. file.Close()
  129. changes, err = filesystem.Changes()
  130. if err != nil {
  131. t.Fatal(err)
  132. }
  133. if len(changes) != 3 {
  134. t.Errorf("Unexpected changes: %v", changes)
  135. }
  136. if changes[0].Path != "/sub_change" || changes[0].Kind != ChangeAdd || changes[1].Path != "/sub_change/test" || changes[1].Kind != ChangeAdd {
  137. t.Errorf("Unexpected changes: %v", changes)
  138. }
  139. // Test permission change
  140. if err := os.Chmod(path.Join(rootfs, "root"), 0000); err != nil {
  141. t.Fatal(err)
  142. }
  143. changes, err = filesystem.Changes()
  144. if err != nil {
  145. t.Fatal(err)
  146. }
  147. if len(changes) != 4 {
  148. t.Errorf("Unexpected changes: %v", changes)
  149. }
  150. if changes[0].Path != "/root" || changes[0].Kind != ChangeModify {
  151. t.Errorf("Unexpected changes: %v", changes)
  152. }
  153. // Test removal
  154. if err := os.Remove(path.Join(rootfs, "etc", "passwd")); err != nil {
  155. t.Fatal(err)
  156. }
  157. changes, err = filesystem.Changes()
  158. if err != nil {
  159. t.Fatal(err)
  160. }
  161. if len(changes) != 6 {
  162. t.Errorf("Unexpected changes: %v", changes)
  163. }
  164. if changes[0].Path != "/etc" || changes[0].Kind != ChangeModify || changes[1].Path != "/etc/passwd" || changes[1].Kind != ChangeDelete {
  165. t.Errorf("Unexpected changes: %v", changes)
  166. }
  167. // Test sub-directory removal
  168. if err := os.Remove(path.Join(rootfs, "usr", "bin", "sudo")); err != nil {
  169. t.Fatal(err)
  170. }
  171. changes, err = filesystem.Changes()
  172. if err != nil {
  173. t.Fatal(err)
  174. }
  175. if len(changes) != 8 {
  176. t.Errorf("Unexpected changes: %v", changes)
  177. }
  178. if changes[6].Path != "/usr/bin" || changes[6].Kind != ChangeModify || changes[7].Path != "/usr/bin/sudo" || changes[7].Kind != ChangeDelete {
  179. t.Errorf("Unexpected changes: %v", changes)
  180. }
  181. }