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