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  }