gopkg.in/docker/docker.v20@v20.10.27/builder/remotecontext/tarsum_test.go (about)

     1  package remotecontext // import "github.com/docker/docker/builder/remotecontext"
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"testing"
     7  
     8  	"github.com/docker/docker/builder"
     9  	"github.com/docker/docker/pkg/archive"
    10  	"github.com/docker/docker/pkg/reexec"
    11  	"github.com/pkg/errors"
    12  	"gotest.tools/v3/skip"
    13  )
    14  
    15  const (
    16  	filename = "test"
    17  	contents = "contents test"
    18  )
    19  
    20  func init() {
    21  	reexec.Init()
    22  }
    23  
    24  func TestCloseRootDirectory(t *testing.T) {
    25  	contextDir, err := os.MkdirTemp("", "builder-tarsum-test")
    26  	defer os.RemoveAll(contextDir)
    27  	if err != nil {
    28  		t.Fatalf("Error with creating temporary directory: %s", err)
    29  	}
    30  
    31  	src := makeTestArchiveContext(t, contextDir)
    32  	err = src.Close()
    33  
    34  	if err != nil {
    35  		t.Fatalf("Error while executing Close: %s", err)
    36  	}
    37  
    38  	_, err = os.Stat(src.Root().Path())
    39  
    40  	if !errors.Is(err, os.ErrNotExist) {
    41  		t.Fatal("Directory should not exist at this point")
    42  	}
    43  }
    44  
    45  func TestHashFile(t *testing.T) {
    46  	contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test")
    47  	defer cleanup()
    48  
    49  	createTestTempFile(t, contextDir, filename, contents, 0755)
    50  
    51  	tarSum := makeTestArchiveContext(t, contextDir)
    52  
    53  	sum, err := tarSum.Hash(filename)
    54  
    55  	if err != nil {
    56  		t.Fatalf("Error when executing Stat: %s", err)
    57  	}
    58  
    59  	if len(sum) == 0 {
    60  		t.Fatalf("Hash returned empty sum")
    61  	}
    62  
    63  	expected := "1149ab94af7be6cc1da1335e398f24ee1cf4926b720044d229969dfc248ae7ec"
    64  
    65  	if actual := sum; expected != actual {
    66  		t.Fatalf("invalid checksum. expected %s, got %s", expected, actual)
    67  	}
    68  }
    69  
    70  func TestHashSubdir(t *testing.T) {
    71  	contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test")
    72  	defer cleanup()
    73  
    74  	contextSubdir := filepath.Join(contextDir, "builder-tarsum-test-subdir")
    75  	err := os.Mkdir(contextSubdir, 0755)
    76  	if err != nil {
    77  		t.Fatalf("Failed to make directory: %s", contextSubdir)
    78  	}
    79  
    80  	testFilename := createTestTempFile(t, contextSubdir, filename, contents, 0755)
    81  
    82  	tarSum := makeTestArchiveContext(t, contextDir)
    83  
    84  	relativePath, err := filepath.Rel(contextDir, testFilename)
    85  
    86  	if err != nil {
    87  		t.Fatalf("Error when getting relative path: %s", err)
    88  	}
    89  
    90  	sum, err := tarSum.Hash(relativePath)
    91  
    92  	if err != nil {
    93  		t.Fatalf("Error when executing Stat: %s", err)
    94  	}
    95  
    96  	if len(sum) == 0 {
    97  		t.Fatalf("Hash returned empty sum")
    98  	}
    99  
   100  	expected := "d7f8d6353dee4816f9134f4156bf6a9d470fdadfb5d89213721f7e86744a4e69"
   101  
   102  	if actual := sum; expected != actual {
   103  		t.Fatalf("invalid checksum. expected %s, got %s", expected, actual)
   104  	}
   105  }
   106  
   107  func TestRemoveDirectory(t *testing.T) {
   108  	contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test")
   109  	defer cleanup()
   110  
   111  	contextSubdir := createTestTempSubdir(t, contextDir, "builder-tarsum-test-subdir")
   112  
   113  	relativePath, err := filepath.Rel(contextDir, contextSubdir)
   114  
   115  	if err != nil {
   116  		t.Fatalf("Error when getting relative path: %s", err)
   117  	}
   118  
   119  	src := makeTestArchiveContext(t, contextDir)
   120  
   121  	_, err = src.Root().Stat(src.Root().Join(src.Root().Path(), relativePath))
   122  	if err != nil {
   123  		t.Fatalf("Statting %s shouldn't fail: %+v", relativePath, err)
   124  	}
   125  
   126  	tarSum := src.(modifiableContext)
   127  	err = tarSum.Remove(relativePath)
   128  	if err != nil {
   129  		t.Fatalf("Error when executing Remove: %s", err)
   130  	}
   131  
   132  	_, err = src.Root().Stat(src.Root().Join(src.Root().Path(), relativePath))
   133  	if !errors.Is(err, os.ErrNotExist) {
   134  		t.Fatalf("Directory should not exist at this point: %+v ", err)
   135  	}
   136  }
   137  
   138  func makeTestArchiveContext(t *testing.T, dir string) builder.Source {
   139  	skip.If(t, os.Getuid() != 0, "skipping test that requires root")
   140  	tarStream, err := archive.Tar(dir, archive.Uncompressed)
   141  	if err != nil {
   142  		t.Fatalf("error: %s", err)
   143  	}
   144  	defer tarStream.Close()
   145  	tarSum, err := FromArchive(tarStream)
   146  	if err != nil {
   147  		t.Fatalf("Error when executing FromArchive: %s", err)
   148  	}
   149  	return tarSum
   150  }