filesystem_test.go 4.5 KB

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