detect_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package remotecontext
  2. import (
  3. "errors"
  4. "io/ioutil"
  5. "log"
  6. "os"
  7. "path/filepath"
  8. "sort"
  9. "testing"
  10. "github.com/docker/docker/builder"
  11. )
  12. const (
  13. dockerfileContents = "FROM busybox"
  14. dockerignoreFilename = ".dockerignore"
  15. testfileContents = "test"
  16. )
  17. const shouldStayFilename = "should_stay"
  18. func extractFilenames(files []os.FileInfo) []string {
  19. filenames := make([]string, len(files), len(files))
  20. for i, file := range files {
  21. filenames[i] = file.Name()
  22. }
  23. return filenames
  24. }
  25. func checkDirectory(t *testing.T, dir string, expectedFiles []string) {
  26. files, err := ioutil.ReadDir(dir)
  27. if err != nil {
  28. t.Fatalf("Could not read directory: %s", err)
  29. }
  30. if len(files) != len(expectedFiles) {
  31. log.Fatalf("Directory should contain exactly %d file(s), got %d", len(expectedFiles), len(files))
  32. }
  33. filenames := extractFilenames(files)
  34. sort.Strings(filenames)
  35. sort.Strings(expectedFiles)
  36. for i, filename := range filenames {
  37. if filename != expectedFiles[i] {
  38. t.Fatalf("File %s should be in the directory, got: %s", expectedFiles[i], filename)
  39. }
  40. }
  41. }
  42. func executeProcess(t *testing.T, contextDir string) {
  43. modifiableCtx := &stubRemote{root: contextDir}
  44. err := removeDockerfile(modifiableCtx, builder.DefaultDockerfileName)
  45. if err != nil {
  46. t.Fatalf("Error when executing Process: %s", err)
  47. }
  48. }
  49. func TestProcessShouldRemoveDockerfileDockerignore(t *testing.T) {
  50. contextDir, cleanup := createTestTempDir(t, "", "builder-dockerignore-process-test")
  51. defer cleanup()
  52. createTestTempFile(t, contextDir, shouldStayFilename, testfileContents, 0777)
  53. createTestTempFile(t, contextDir, dockerignoreFilename, "Dockerfile\n.dockerignore", 0777)
  54. createTestTempFile(t, contextDir, builder.DefaultDockerfileName, dockerfileContents, 0777)
  55. executeProcess(t, contextDir)
  56. checkDirectory(t, contextDir, []string{shouldStayFilename})
  57. }
  58. func TestProcessNoDockerignore(t *testing.T) {
  59. contextDir, cleanup := createTestTempDir(t, "", "builder-dockerignore-process-test")
  60. defer cleanup()
  61. createTestTempFile(t, contextDir, shouldStayFilename, testfileContents, 0777)
  62. createTestTempFile(t, contextDir, builder.DefaultDockerfileName, dockerfileContents, 0777)
  63. executeProcess(t, contextDir)
  64. checkDirectory(t, contextDir, []string{shouldStayFilename, builder.DefaultDockerfileName})
  65. }
  66. func TestProcessShouldLeaveAllFiles(t *testing.T) {
  67. contextDir, cleanup := createTestTempDir(t, "", "builder-dockerignore-process-test")
  68. defer cleanup()
  69. createTestTempFile(t, contextDir, shouldStayFilename, testfileContents, 0777)
  70. createTestTempFile(t, contextDir, builder.DefaultDockerfileName, dockerfileContents, 0777)
  71. createTestTempFile(t, contextDir, dockerignoreFilename, "input1\ninput2", 0777)
  72. executeProcess(t, contextDir)
  73. checkDirectory(t, contextDir, []string{shouldStayFilename, builder.DefaultDockerfileName, dockerignoreFilename})
  74. }
  75. // TODO: remove after moving to a separate pkg
  76. type stubRemote struct {
  77. root string
  78. }
  79. func (r *stubRemote) Hash(path string) (string, error) {
  80. return "", errors.New("not implemented")
  81. }
  82. func (r *stubRemote) Root() string {
  83. return r.root
  84. }
  85. func (r *stubRemote) Close() error {
  86. return errors.New("not implemented")
  87. }
  88. func (r *stubRemote) Remove(p string) error {
  89. return os.Remove(filepath.Join(r.root, p))
  90. }