blob_test.go raw
1 package blob
2
3 import (
4 "archive/tar"
5 "bytes"
6 "crypto/sha256"
7 "encoding/json"
8 "os"
9 "path/filepath"
10 "testing"
11
12 "git.smesh.lol/torly/pkg/blossom"
13 "git.smesh.lol/torly/pkg/nostr"
14 )
15
16 func TestLiveRestoreSpool(t *testing.T) {
17 root := filepath.Join(t.TempDir(), "blossom")
18 srv, err := blossom.Open(root, 1<<20)
19 if err != nil {
20 t.Fatal(err)
21 }
22 defer srv.Close()
23
24 body := []byte("live restore payload")
25 sum := sha256.Sum256(body)
26 hash := nostr.Hex(sum[:])
27 var buf bytes.Buffer
28 tw := tar.NewWriter(&buf)
29 manifest, _ := json.Marshal(blossom.BackupManifest{
30 Version: 1,
31 Blobs: []blossom.BackupEntry{{
32 SHA256: hash, PubKey: "abababababababababababababababababababababababababababababababab",
33 Size: int64(len(body)), Type: "text/plain", Created: 1700000000,
34 }},
35 })
36 if err := tw.WriteHeader(&tar.Header{Name: "manifest.json", Mode: 0o644, Size: int64(len(manifest))}); err != nil {
37 t.Fatal(err)
38 }
39 if _, err := tw.Write(manifest); err != nil {
40 t.Fatal(err)
41 }
42 if err := tw.WriteHeader(&tar.Header{Name: "blobs/" + hash, Mode: 0o644, Size: int64(len(body))}); err != nil {
43 t.Fatal(err)
44 }
45 if _, err := tw.Write(body); err != nil {
46 t.Fatal(err)
47 }
48 if err := tw.Close(); err != nil {
49 t.Fatal(err)
50 }
51 if err := os.WriteFile(filepath.Join(root, restoreTarName), buf.Bytes(), 0o644); err != nil {
52 t.Fatal(err)
53 }
54
55 checkRestore(srv, root)
56
57 raw, err := os.ReadFile(filepath.Join(root, restoreStatusName))
58 if err != nil {
59 t.Fatal(err)
60 }
61 var status restoreStatus
62 if err := json.Unmarshal(raw, &status); err != nil {
63 t.Fatal(err)
64 }
65 if !status.OK || status.Restored != 1 {
66 t.Fatalf("status: %+v", status)
67 }
68 if _, err := os.Stat(filepath.Join(root, restoreTarName)); !os.IsNotExist(err) {
69 t.Fatal("restore tar was not consumed")
70 }
71 if _, err := os.Stat(srvBlobPath(srv, hash)); err != nil {
72 t.Fatal(err)
73 }
74 }
75
76 func srvBlobPath(s *blossom.Server, hash string) string {
77 return filepath.Join(s.Dir(), "blobs", hash[:2], hash)
78 }
79