github.com/kubri/kubri@v0.5.1-0.20240317001612-bda2aaef967e/integrations/apk/build_test.go (about) 1 package apk_test 2 3 import ( 4 "context" 5 "io" 6 "io/fs" 7 "os" 8 "path/filepath" 9 "testing" 10 11 "github.com/google/go-cmp/cmp" 12 "gitlab.alpinelinux.org/alpine/go/repository" 13 14 "github.com/kubri/kubri/integrations/apk" 15 "github.com/kubri/kubri/internal/test" 16 "github.com/kubri/kubri/pkg/crypto/rsa" 17 source "github.com/kubri/kubri/source/file" 18 target "github.com/kubri/kubri/target/file" 19 ) 20 21 func TestBuild(t *testing.T) { 22 want := readTestData(t) 23 24 dir := t.TempDir() + "/rpm" 25 src, _ := source.New(source.Config{Path: "../../testdata"}) 26 tgt, _ := target.New(target.Config{Path: dir}) 27 28 test.Golden(t, "testdata", dir, test.Ignore("*.apk")) 29 30 c := &apk.Config{ 31 Source: src, 32 Target: tgt, 33 } 34 35 t.Run("New", func(t *testing.T) { 36 testBuild(t, c, want) 37 }) 38 39 t.Run("NoChange", func(t *testing.T) { 40 testBuild(t, c, want) 41 }) 42 43 t.Run("RSA", func(t *testing.T) { 44 rsaKey, _ := rsa.NewPrivateKey() 45 dir := t.TempDir() 46 tgt, _ := target.New(target.Config{Path: dir}) 47 48 c := &apk.Config{ 49 Source: src, 50 Target: tgt, 51 RSAKey: rsaKey, 52 KeyName: "test@example.com", 53 } 54 55 err := apk.Build(context.Background(), c) 56 if err != nil { 57 t.Fatal(err) 58 } 59 60 pubBytes, _ := os.ReadFile(filepath.Join(dir, "test@example.com.rsa.pub")) 61 pub, _ := rsa.UnmarshalPublicKey(pubBytes) 62 if !rsaKey.PublicKey.Equal(pub) { 63 t.Fatal("should have public key") 64 } 65 66 indexFile, _ := os.Open(filepath.Join(dir, "x86_64", "APKINDEX.tar.gz")) 67 apkindex, _ := repository.IndexFromArchive(indexFile) 68 unsigedIndex, _ := repository.ArchiveFromIndex(apkindex) 69 indexBytes, _ := io.ReadAll(unsigedIndex) 70 if !rsa.Verify(pub, indexBytes, apkindex.Signature) { 71 t.Fatal("should pass RSA verification") 72 } 73 }) 74 } 75 76 func readTestData(t *testing.T) map[string][]byte { 77 t.Helper() 78 79 want := make(map[string][]byte) 80 81 err := fs.WalkDir(os.DirFS("testdata"), ".", func(path string, d fs.DirEntry, err error) error { 82 if err != nil || d.IsDir() { 83 return err 84 } 85 b, err := fs.ReadFile(os.DirFS("testdata"), path) 86 if err != nil { 87 return err 88 } 89 want[path] = b 90 return nil 91 }) 92 if err != nil { 93 t.Fatal(err) 94 } 95 96 return want 97 } 98 99 func testBuild(t *testing.T, c *apk.Config, want map[string][]byte) { 100 t.Helper() 101 102 err := apk.Build(context.Background(), c) 103 if err != nil { 104 t.Fatal(err) 105 } 106 107 for name, data := range want { 108 r, err := c.Target.NewReader(context.Background(), name) 109 if err != nil { 110 t.Fatal(name, err) 111 } 112 defer r.Close() 113 114 got, err := io.ReadAll(r) 115 if err != nil { 116 t.Fatal(name, err) 117 } 118 119 if diff := cmp.Diff(data, got); diff != "" { 120 t.Error(name, diff) 121 } 122 } 123 }