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  }