github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/builder/remotecontext/detect_test.go (about)

     1  package remotecontext // import "github.com/Prakhar-Agarwal-byte/moby/builder/remotecontext"
     2  
     3  import (
     4  	"errors"
     5  	"log"
     6  	"os"
     7  	"path/filepath"
     8  	"sort"
     9  	"testing"
    10  
    11  	"github.com/Prakhar-Agarwal-byte/moby/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  	if err != nil {
    35  		t.Fatalf("Could not read directory: %s", err)
    36  	}
    37  
    38  	if len(files) != len(expectedFiles) {
    39  		log.Fatalf("Directory should contain exactly %d file(s), got %d", len(expectedFiles), len(files))
    40  	}
    41  
    42  	filenames := extractFilenames(files)
    43  	sort.Strings(filenames)
    44  	sort.Strings(expectedFiles)
    45  
    46  	for i, filename := range filenames {
    47  		if filename != expectedFiles[i] {
    48  			t.Fatalf("File %s should be in the directory, got: %s", expectedFiles[i], filename)
    49  		}
    50  	}
    51  }
    52  
    53  func executeProcess(t *testing.T, contextDir string) {
    54  	modifiableCtx := &stubRemote{root: contextDir}
    55  
    56  	err := removeDockerfile(modifiableCtx, builder.DefaultDockerfileName)
    57  	if err != nil {
    58  		t.Fatalf("Error when executing Process: %s", err)
    59  	}
    60  }
    61  
    62  func TestProcessShouldRemoveDockerfileDockerignore(t *testing.T) {
    63  	contextDir, cleanup := createTestTempDir(t, "", "builder-dockerignore-process-test")
    64  	defer cleanup()
    65  
    66  	createTestTempFile(t, contextDir, shouldStayFilename, testfileContents, 0o777)
    67  	createTestTempFile(t, contextDir, dockerignoreFilename, "Dockerfile\n.dockerignore", 0o777)
    68  	createTestTempFile(t, contextDir, builder.DefaultDockerfileName, dockerfileContents, 0o777)
    69  
    70  	executeProcess(t, contextDir)
    71  
    72  	checkDirectory(t, contextDir, []string{shouldStayFilename})
    73  }
    74  
    75  func TestProcessNoDockerignore(t *testing.T) {
    76  	contextDir, cleanup := createTestTempDir(t, "", "builder-dockerignore-process-test")
    77  	defer cleanup()
    78  
    79  	createTestTempFile(t, contextDir, shouldStayFilename, testfileContents, 0o777)
    80  	createTestTempFile(t, contextDir, builder.DefaultDockerfileName, dockerfileContents, 0o777)
    81  
    82  	executeProcess(t, contextDir)
    83  
    84  	checkDirectory(t, contextDir, []string{shouldStayFilename, builder.DefaultDockerfileName})
    85  }
    86  
    87  func TestProcessShouldLeaveAllFiles(t *testing.T) {
    88  	contextDir, cleanup := createTestTempDir(t, "", "builder-dockerignore-process-test")
    89  	defer cleanup()
    90  
    91  	createTestTempFile(t, contextDir, shouldStayFilename, testfileContents, 0o777)
    92  	createTestTempFile(t, contextDir, builder.DefaultDockerfileName, dockerfileContents, 0o777)
    93  	createTestTempFile(t, contextDir, dockerignoreFilename, "input1\ninput2", 0o777)
    94  
    95  	executeProcess(t, contextDir)
    96  
    97  	checkDirectory(t, contextDir, []string{shouldStayFilename, builder.DefaultDockerfileName, dockerignoreFilename})
    98  }
    99  
   100  // TODO: remove after moving to a separate pkg
   101  type stubRemote struct {
   102  	root string
   103  }
   104  
   105  func (r *stubRemote) Hash(path string) (string, error) {
   106  	return "", errors.New("not implemented")
   107  }
   108  
   109  func (r *stubRemote) Root() string {
   110  	return r.root
   111  }
   112  
   113  func (r *stubRemote) Close() error {
   114  	return errors.New("not implemented")
   115  }
   116  
   117  func (r *stubRemote) Remove(p string) error {
   118  	return os.Remove(filepath.Join(r.root, p))
   119  }