package blob import ( "archive/tar" "bytes" "crypto/sha256" "encoding/json" "os" "path/filepath" "testing" "git.smesh.lol/torly/pkg/blossom" "git.smesh.lol/torly/pkg/nostr" ) func TestLiveRestoreSpool(t *testing.T) { root := filepath.Join(t.TempDir(), "blossom") srv, err := blossom.Open(root, 1<<20) if err != nil { t.Fatal(err) } defer srv.Close() body := []byte("live restore payload") sum := sha256.Sum256(body) hash := nostr.Hex(sum[:]) var buf bytes.Buffer tw := tar.NewWriter(&buf) manifest, _ := json.Marshal(blossom.BackupManifest{ Version: 1, Blobs: []blossom.BackupEntry{{ SHA256: hash, PubKey: "abababababababababababababababababababababababababababababababab", Size: int64(len(body)), Type: "text/plain", Created: 1700000000, }}, }) if err := tw.WriteHeader(&tar.Header{Name: "manifest.json", Mode: 0o644, Size: int64(len(manifest))}); err != nil { t.Fatal(err) } if _, err := tw.Write(manifest); err != nil { t.Fatal(err) } if err := tw.WriteHeader(&tar.Header{Name: "blobs/" + hash, Mode: 0o644, Size: int64(len(body))}); err != nil { t.Fatal(err) } if _, err := tw.Write(body); err != nil { t.Fatal(err) } if err := tw.Close(); err != nil { t.Fatal(err) } if err := os.WriteFile(filepath.Join(root, restoreTarName), buf.Bytes(), 0o644); err != nil { t.Fatal(err) } checkRestore(srv, root) raw, err := os.ReadFile(filepath.Join(root, restoreStatusName)) if err != nil { t.Fatal(err) } var status restoreStatus if err := json.Unmarshal(raw, &status); err != nil { t.Fatal(err) } if !status.OK || status.Restored != 1 { t.Fatalf("status: %+v", status) } if _, err := os.Stat(filepath.Join(root, restoreTarName)); !os.IsNotExist(err) { t.Fatal("restore tar was not consumed") } if _, err := os.Stat(srvBlobPath(srv, hash)); err != nil { t.Fatal(err) } } func srvBlobPath(s *blossom.Server, hash string) string { return filepath.Join(s.Dir(), "blobs", hash[:2], hash) }