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 }