blossom_test.go raw

   1  package blossom
   2  
   3  import (
   4  	"strings"
   5  	"testing"
   6  )
   7  
   8  // TestIndexReopen pins the index record layout: an offset mistake here makes a
   9  // relay panic when it opens a data directory that contains blobs.
  10  func TestIndexReopen(t *testing.T) {
  11  	dir := t.TempDir()
  12  	s, err := Open(dir, 1<<20)
  13  	if err != nil {
  14  		t.Fatal(err)
  15  	}
  16  	hash := strings.Repeat("ab", 32)
  17  	pub := strings.Repeat("cd", 32)
  18  	b := &Blob{Hash: hash, PubKey: pub, Size: 1234, Type: "text/plain", Created: 1700000000}
  19  	s.mu.Lock()
  20  	s.putMem(b)
  21  	err = s.appendRecord('p', b)
  22  	s.mu.Unlock()
  23  	if err != nil {
  24  		t.Fatal(err)
  25  	}
  26  	if err := s.Close(); err != nil {
  27  		t.Fatal(err)
  28  	}
  29  
  30  	s2, err := Open(dir, 1<<20)
  31  	if err != nil {
  32  		t.Fatal(err)
  33  	}
  34  	got := s2.blobs[hash]
  35  	if got == nil {
  36  		t.Fatal("blob missing after reopen")
  37  	}
  38  	if got.Size != b.Size || got.Created != b.Created || got.Type != b.Type || got.PubKey != pub {
  39  		t.Fatalf("blob metadata mismatch: %+v", got)
  40  	}
  41  	if len(s2.byPub[pub]) != 1 {
  42  		t.Fatal("pubkey index not rebuilt")
  43  	}
  44  
  45  	s2.mu.Lock()
  46  	s2.delMem(hash)
  47  	err = s2.appendRecord('d', b)
  48  	s2.mu.Unlock()
  49  	if err != nil {
  50  		t.Fatal(err)
  51  	}
  52  	s2.Close()
  53  
  54  	s3, err := Open(dir, 1<<20)
  55  	if err != nil {
  56  		t.Fatal(err)
  57  	}
  58  	defer s3.Close()
  59  	if s3.blobs[hash] != nil {
  60  		t.Fatal("deleted blob returned after reopen")
  61  	}
  62  }
  63