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