github.com/docker/engine@v22.0.0-20211208180946-d456264580cf+incompatible/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 "sort" 8 "testing" 9 10 "github.com/docker/docker/builder" 11 "github.com/docker/docker/pkg/containerfs" 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: containerfs.NewLocalContainerFS(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 78 func TestProcessNoDockerignore(t *testing.T) { 79 contextDir, cleanup := createTestTempDir(t, "", "builder-dockerignore-process-test") 80 defer cleanup() 81 82 createTestTempFile(t, contextDir, shouldStayFilename, testfileContents, 0777) 83 createTestTempFile(t, contextDir, builder.DefaultDockerfileName, dockerfileContents, 0777) 84 85 executeProcess(t, contextDir) 86 87 checkDirectory(t, contextDir, []string{shouldStayFilename, builder.DefaultDockerfileName}) 88 89 } 90 91 func TestProcessShouldLeaveAllFiles(t *testing.T) { 92 contextDir, cleanup := createTestTempDir(t, "", "builder-dockerignore-process-test") 93 defer cleanup() 94 95 createTestTempFile(t, contextDir, shouldStayFilename, testfileContents, 0777) 96 createTestTempFile(t, contextDir, builder.DefaultDockerfileName, dockerfileContents, 0777) 97 createTestTempFile(t, contextDir, dockerignoreFilename, "input1\ninput2", 0777) 98 99 executeProcess(t, contextDir) 100 101 checkDirectory(t, contextDir, []string{shouldStayFilename, builder.DefaultDockerfileName, dockerignoreFilename}) 102 103 } 104 105 // TODO: remove after moving to a separate pkg 106 type stubRemote struct { 107 root containerfs.ContainerFS 108 } 109 110 func (r *stubRemote) Hash(path string) (string, error) { 111 return "", errors.New("not implemented") 112 } 113 114 func (r *stubRemote) Root() containerfs.ContainerFS { 115 return r.root 116 } 117 func (r *stubRemote) Close() error { 118 return errors.New("not implemented") 119 } 120 func (r *stubRemote) Remove(p string) error { 121 return r.root.Remove(r.root.Join(r.root.Path(), p)) 122 }