github.com/kubri/kubri@v0.5.1-0.20240317001612-bda2aaef967e/integrations/yum/build_test.go (about)

     1  package yum_test
     2  
     3  import (
     4  	"context"
     5  	"io"
     6  	"io/fs"
     7  	"os"
     8  	"path/filepath"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/google/go-cmp/cmp"
    13  
    14  	"github.com/kubri/kubri/integrations/yum"
    15  	"github.com/kubri/kubri/internal/test"
    16  	"github.com/kubri/kubri/pkg/crypto/pgp"
    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  	now := time.Date(2023, 11, 19, 23, 37, 12, 0, time.UTC)
    24  
    25  	dir := t.TempDir() + "/rpm"
    26  	src, _ := source.New(source.Config{Path: "../../testdata"})
    27  	tgt, _ := target.New(target.Config{Path: dir})
    28  	key, _ := pgp.NewPrivateKey("test", "test@example.com")
    29  
    30  	test.Golden(t, "testdata", dir, test.Ignore("*.rpm", "*.key", "*.asc"))
    31  
    32  	c := &yum.Config{
    33  		Source: src,
    34  		Target: tgt,
    35  		PGPKey: key,
    36  	}
    37  
    38  	t.Run("New", func(t *testing.T) {
    39  		testBuild(t, c, want, now)
    40  	})
    41  
    42  	t.Run("NoChange", func(t *testing.T) {
    43  		testBuild(t, c, want, now.Add(time.Hour))
    44  	})
    45  
    46  	t.Run("PGP", func(t *testing.T) {
    47  		dir := t.TempDir()
    48  		pgpKey, _ := pgp.NewPrivateKey("test", "test@example.com")
    49  		tgt, _ := target.New(target.Config{Path: dir})
    50  
    51  		c := &yum.Config{
    52  			Source: src,
    53  			Target: tgt,
    54  			PGPKey: pgpKey,
    55  		}
    56  
    57  		testBuild(t, c, want, now)
    58  
    59  		data, _ := os.ReadFile(filepath.Join(dir, "repodata", "repomd.xml"))
    60  		key, _ := os.ReadFile(filepath.Join(dir, "repodata", "repomd.xml.key"))
    61  		sig, _ := os.ReadFile(filepath.Join(dir, "repodata", "repomd.xml.asc"))
    62  		pub, _ := pgp.UnmarshalPublicKey(key)
    63  
    64  		if !pgp.Verify(pub, data, sig) {
    65  			t.Error("should pass pgp verification")
    66  		}
    67  	})
    68  }
    69  
    70  func readTestData(t *testing.T) map[string][]byte {
    71  	t.Helper()
    72  
    73  	want := make(map[string][]byte)
    74  
    75  	err := fs.WalkDir(os.DirFS("testdata"), ".", func(path string, d fs.DirEntry, err error) error {
    76  		if err != nil || d.IsDir() {
    77  			return err
    78  		}
    79  		b, err := fs.ReadFile(os.DirFS("testdata"), path)
    80  		if err != nil {
    81  			return err
    82  		}
    83  		want[path] = b
    84  		return nil
    85  	})
    86  	if err != nil {
    87  		t.Fatal(err)
    88  	}
    89  
    90  	return want
    91  }
    92  
    93  func testBuild(t *testing.T, c *yum.Config, want map[string][]byte, now time.Time) {
    94  	t.Helper()
    95  
    96  	yum.SetTime(now)
    97  
    98  	err := yum.Build(context.Background(), c)
    99  	if err != nil {
   100  		t.Fatal(err)
   101  	}
   102  
   103  	for name, data := range want {
   104  		r, err := c.Target.NewReader(context.Background(), name)
   105  		if err != nil {
   106  			t.Fatal(name, err)
   107  		}
   108  		defer r.Close()
   109  
   110  		got, err := io.ReadAll(r)
   111  		if err != nil {
   112  			t.Fatal(name, err)
   113  		}
   114  
   115  		if diff := cmp.Diff(data, got); diff != "" {
   116  			t.Error(name, diff)
   117  		}
   118  	}
   119  }