tarsum_test.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. package builder
  2. import (
  3. "bufio"
  4. "bytes"
  5. "io/ioutil"
  6. "os"
  7. "path/filepath"
  8. "testing"
  9. "github.com/docker/docker/pkg/archive"
  10. "github.com/docker/docker/pkg/reexec"
  11. )
  12. const (
  13. filename = "test"
  14. contents = "contents test"
  15. )
  16. func init() {
  17. reexec.Init()
  18. }
  19. func TestCloseRootDirectory(t *testing.T) {
  20. contextDir, err := ioutil.TempDir("", "builder-tarsum-test")
  21. if err != nil {
  22. t.Fatalf("Error with creating temporary directory: %s", err)
  23. }
  24. tarsum := &tarSumContext{root: contextDir}
  25. err = tarsum.Close()
  26. if err != nil {
  27. t.Fatalf("Error while executing Close: %s", err)
  28. }
  29. _, err = os.Stat(contextDir)
  30. if !os.IsNotExist(err) {
  31. t.Fatalf("Directory should not exist at this point")
  32. defer os.RemoveAll(contextDir)
  33. }
  34. }
  35. func TestOpenFile(t *testing.T) {
  36. contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test")
  37. defer cleanup()
  38. createTestTempFile(t, contextDir, filename, contents, 0777)
  39. tarSum := &tarSumContext{root: contextDir}
  40. file, err := tarSum.Open(filename)
  41. if err != nil {
  42. t.Fatalf("Error when executing Open: %s", err)
  43. }
  44. defer file.Close()
  45. scanner := bufio.NewScanner(file)
  46. buff := bytes.NewBufferString("")
  47. for scanner.Scan() {
  48. buff.WriteString(scanner.Text())
  49. }
  50. if contents != buff.String() {
  51. t.Fatalf("Contents are not equal. Expected: %s, got: %s", contents, buff.String())
  52. }
  53. }
  54. func TestOpenNotExisting(t *testing.T) {
  55. contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test")
  56. defer cleanup()
  57. tarSum := &tarSumContext{root: contextDir}
  58. file, err := tarSum.Open("not-existing")
  59. if file != nil {
  60. t.Fatal("Opened file should be nil")
  61. }
  62. if !os.IsNotExist(err) {
  63. t.Fatalf("Error when executing Open: %s", err)
  64. }
  65. }
  66. func TestStatFile(t *testing.T) {
  67. contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test")
  68. defer cleanup()
  69. testFilename := createTestTempFile(t, contextDir, filename, contents, 0777)
  70. tarSum := &tarSumContext{root: contextDir}
  71. relPath, fileInfo, err := tarSum.Stat(filename)
  72. if err != nil {
  73. t.Fatalf("Error when executing Stat: %s", err)
  74. }
  75. if relPath != filename {
  76. t.Fatalf("Relative path should be equal to %s, got %s", filename, relPath)
  77. }
  78. if fileInfo.Path() != testFilename {
  79. t.Fatalf("Full path should be equal to %s, got %s", testFilename, fileInfo.Path())
  80. }
  81. }
  82. func TestStatSubdir(t *testing.T) {
  83. contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test")
  84. defer cleanup()
  85. contextSubdir := createTestTempSubdir(t, contextDir, "builder-tarsum-test-subdir")
  86. testFilename := createTestTempFile(t, contextSubdir, filename, contents, 0777)
  87. tarSum := &tarSumContext{root: contextDir}
  88. relativePath, err := filepath.Rel(contextDir, testFilename)
  89. if err != nil {
  90. t.Fatalf("Error when getting relative path: %s", err)
  91. }
  92. relPath, fileInfo, err := tarSum.Stat(relativePath)
  93. if err != nil {
  94. t.Fatalf("Error when executing Stat: %s", err)
  95. }
  96. if relPath != relativePath {
  97. t.Fatalf("Relative path should be equal to %s, got %s", relativePath, relPath)
  98. }
  99. if fileInfo.Path() != testFilename {
  100. t.Fatalf("Full path should be equal to %s, got %s", testFilename, fileInfo.Path())
  101. }
  102. }
  103. func TestStatNotExisting(t *testing.T) {
  104. contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test")
  105. defer cleanup()
  106. tarSum := &tarSumContext{root: contextDir}
  107. relPath, fileInfo, err := tarSum.Stat("not-existing")
  108. if relPath != "" {
  109. t.Fatal("Relative path should be nil")
  110. }
  111. if fileInfo != nil {
  112. t.Fatalf("File info should be nil")
  113. }
  114. if !os.IsNotExist(err) {
  115. t.Fatalf("This file should not exist: %s", err)
  116. }
  117. }
  118. func TestRemoveDirectory(t *testing.T) {
  119. contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test")
  120. defer cleanup()
  121. contextSubdir := createTestTempSubdir(t, contextDir, "builder-tarsum-test-subdir")
  122. relativePath, err := filepath.Rel(contextDir, contextSubdir)
  123. if err != nil {
  124. t.Fatalf("Error when getting relative path: %s", err)
  125. }
  126. tarSum := &tarSumContext{root: contextDir}
  127. err = tarSum.Remove(relativePath)
  128. if err != nil {
  129. t.Fatalf("Error when executing Remove: %s", err)
  130. }
  131. _, err = os.Stat(contextSubdir)
  132. if !os.IsNotExist(err) {
  133. t.Fatalf("Directory should not exist at this point")
  134. }
  135. }
  136. func TestMakeSumTarContext(t *testing.T) {
  137. contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test")
  138. defer cleanup()
  139. createTestTempFile(t, contextDir, filename, contents, 0777)
  140. tarStream, err := archive.Tar(contextDir, archive.Uncompressed)
  141. if err != nil {
  142. t.Fatalf("error: %s", err)
  143. }
  144. defer tarStream.Close()
  145. tarSum, err := MakeTarSumContext(tarStream)
  146. if err != nil {
  147. t.Fatalf("Error when executing MakeSumContext: %s", err)
  148. }
  149. if tarSum == nil {
  150. t.Fatalf("Tar sum context should not be nil")
  151. }
  152. }
  153. func TestWalkWithoutError(t *testing.T) {
  154. contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test")
  155. defer cleanup()
  156. contextSubdir := createTestTempSubdir(t, contextDir, "builder-tarsum-test-subdir")
  157. createTestTempFile(t, contextSubdir, filename, contents, 0777)
  158. tarSum := &tarSumContext{root: contextDir}
  159. walkFun := func(path string, fi FileInfo, err error) error {
  160. return nil
  161. }
  162. err := tarSum.Walk(contextSubdir, walkFun)
  163. if err != nil {
  164. t.Fatalf("Error when executing Walk: %s", err)
  165. }
  166. }
  167. type WalkError struct {
  168. }
  169. func (we WalkError) Error() string {
  170. return "Error when executing Walk"
  171. }
  172. func TestWalkWithError(t *testing.T) {
  173. contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test")
  174. defer cleanup()
  175. contextSubdir := createTestTempSubdir(t, contextDir, "builder-tarsum-test-subdir")
  176. tarSum := &tarSumContext{root: contextDir}
  177. walkFun := func(path string, fi FileInfo, err error) error {
  178. return WalkError{}
  179. }
  180. err := tarSum.Walk(contextSubdir, walkFun)
  181. if err == nil {
  182. t.Fatalf("Error should not be nil")
  183. }
  184. }