detect_test.go 3.2 KB

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