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