github.com/abergmeier/buildkit_ex@v0.0.0-20220613202848-1145f3866588/pkg/digest/digest_test.go (about)

     1  package digest
     2  
     3  import (
     4  	"crypto/sha512"
     5  	"io"
     6  	"os"
     7  	"reflect"
     8  	"testing"
     9  
    10  	"github.com/abergmeier/buildkit_ex/pkg/digest/options"
    11  )
    12  
    13  func init() {
    14  	os.Chdir("testdata")
    15  }
    16  
    17  func TestDigestOfFileAndAllInputsWithDefaultOptions(t *testing.T) {
    18  	defer os.Remove("foo.txt")
    19  	err := os.WriteFile("foo.txt", []byte("foo"), 0666)
    20  	if err != nil {
    21  		panic(err)
    22  	}
    23  	firstDigest, err := DigestOfFileAndAllInputs("Containerfile")
    24  	if err != nil {
    25  		t.Fatal("DigestOfFileAndAllInputs failed:", err)
    26  	}
    27  	if firstDigest == [sha512.Size]byte{} {
    28  		t.Fatal("Digest not calculated")
    29  	}
    30  	err = os.WriteFile("foo.txt", []byte("fooandbar"), 0666)
    31  	if err != nil {
    32  		panic(err)
    33  	}
    34  	secondDigest, err := DigestOfFileAndAllInputs("Containerfile")
    35  	if err != nil {
    36  		t.Fatal("DigestOfFileAndAllInputs failed:", err)
    37  	}
    38  	if firstDigest == secondDigest {
    39  		t.Fatal("Second digest not properly calculated")
    40  	}
    41  }
    42  
    43  func TestDigestOfFileAndAllInputsDir(t *testing.T) {
    44  	digest, err := DigestOfFileAndAllInputs("Containerfile.dir")
    45  	if err != nil {
    46  		t.Fatal("DigestOfFileAndAllInputs failed:", err)
    47  	}
    48  	if digest == [sha512.Size]byte{} {
    49  		t.Fatal("Digest not calculated")
    50  	}
    51  
    52  	hash := sha512.New()
    53  	copyFileToHash(t, "Containerfile.dir", hash)
    54  	copyFileToHash(t, "includeme/1.txt", hash)
    55  	copyFileToHash(t, "includeme/2.txt", hash)
    56  
    57  	expected := hash.Sum(nil)
    58  	if !reflect.DeepEqual(digest[:], expected) {
    59  		t.Fatalf("Unexpected digest:\n%X\nExpected:\n%X\n", digest, expected)
    60  	}
    61  }
    62  
    63  func TestDigestOfFileAndAllInputsWithRemoteChanged(t *testing.T) {
    64  	t.Parallel()
    65  
    66  	firstDigest, err := DigestOfFileAndAllInputs("Containerfile.remote", options.TreatHttpAlwaysChanged())
    67  	if err != nil {
    68  		t.Fatal("DigestOfFileAndAllInputs failed:", err)
    69  	}
    70  	if firstDigest == [sha512.Size]byte{} {
    71  		t.Fatal("Digest not calculated")
    72  	}
    73  	secondDigest, err := DigestOfFileAndAllInputs("Containerfile.remote", options.TreatHttpAlwaysChanged())
    74  	if err != nil {
    75  		t.Fatal("DigestOfFileAndAllInputs failed:", err)
    76  	}
    77  	if firstDigest == secondDigest {
    78  		t.Fatal("Second digest not properly calculated")
    79  	}
    80  }
    81  
    82  func TestDigestOfFileAndAllInputsWithRemoteUnchanged(t *testing.T) {
    83  	t.Parallel()
    84  
    85  	firstDigest, err := DigestOfFileAndAllInputs("Containerfile.remote", options.TreatHttpAlwaysUnchanged())
    86  	if err != nil {
    87  		t.Fatal("DigestOfFileAndAllInputs failed:", err)
    88  	}
    89  	if firstDigest == [sha512.Size]byte{} {
    90  		t.Fatal("Digest not calculated")
    91  	}
    92  	secondDigest, err := DigestOfFileAndAllInputs("Containerfile.remote", options.TreatHttpAlwaysUnchanged())
    93  	if err != nil {
    94  		t.Fatal("DigestOfFileAndAllInputs failed:", err)
    95  	}
    96  	if firstDigest != secondDigest {
    97  		t.Fatal("Second digest not properly calculated")
    98  	}
    99  }
   100  
   101  func TestDigestOfFileAndAllInputsPrecise(t *testing.T) {
   102  	digest, err := DigestOfFileAndAllInputs("Containerfile.advanced")
   103  	if err != nil {
   104  		t.Fatal("DigestOfFileAndAllInputs failed:", err)
   105  	}
   106  	if digest == [sha512.Size]byte{} {
   107  		t.Fatal("Digest not calculated")
   108  	}
   109  	hash := sha512.New()
   110  	copyFileToHash(t, "Containerfile.advanced", hash)
   111  	copyFileToHash(t, "aybabtu.txt", hash)
   112  	copyFileToHash(t, "dummy.txt", hash)
   113  
   114  	expected := hash.Sum(nil)
   115  	if !reflect.DeepEqual(digest[:], expected) {
   116  		t.Fatalf("Unexpected digest:\n%X\nExpected:\n%X\n", digest, expected)
   117  	}
   118  }
   119  
   120  func copyFileToHash(t *testing.T, filename string, w io.Writer) {
   121  	f, err := os.Open(filename)
   122  	if err != nil {
   123  		panic(err)
   124  	}
   125  	defer f.Close()
   126  	_, err = io.Copy(w, f)
   127  	if err != nil {
   128  		panic(err)
   129  	}
   130  }