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 }