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  }