1package brokerstore
2
3import (
4 "os"
5 "path/filepath"
6 "testing"
7
8 "github.com/stretchr/testify/require"
9)
10
11func TestRecoveryCorruption(t *testing.T) {
12 o := options(t)
13 s, err := Open(o)
14 require.NoError(t, err)
15 require.NoError(t, s.Close())
16 require.NoError(t, os.Remove(filepath.Join(o.Dir, "state.json")))
17 raw, err := readBounded(filepath.Join(o.Dir, "recovery.json"))
18 require.NoError(t, err)
19 var r recovery
20 require.NoError(t, strict(raw, &r))
21 r.Hosts = []byte("changed")
22 // Use the production atomic writer without changing its digest metadata.
23 writer := Store{dir: o.Dir}
24 require.NoError(t, writer.write("recovery.json", r))
25 _, err = Open(o)
26 require.ErrorContains(t, err, "digest mismatch")
27}
28
29func TestDefensiveCopiesAndConcurrentAccess(t *testing.T) {
30 o := options(t)
31 s, err := Open(o)
32 require.NoError(t, err)
33 defer s.Close()
34 h, err := s.LoadHosts()
35 require.NoError(t, err)
36 h.Hosts[0].Policy.Trust = "changed"
37 snap, err := s.Load()
38 require.NoError(t, err)
39 snap.Revision = 999
40 again, err := s.Load()
41 require.NoError(t, err)
42 require.NotEqual(t, snap.Revision, again.Revision)
43 hosts, err := s.LoadHosts()
44 require.NoError(t, err)
45 require.Equal(t, "known-hosts", hosts.Hosts[0].Policy.Trust)
46 done := make(chan struct{})
47 go func() {
48 defer close(done)
49 for i := 0; i < 30; i++ {
50 _, _ = s.Load()
51 _, _ = s.LoadHosts()
52 }
53 }()
54 for i := 0; i < 30; i++ {
55 hosts, err = s.LoadHosts()
56 require.NoError(t, err)
57 require.NoError(t, s.ReplaceHosts(hosts.Revision, hosts.Hosts))
58 }
59 <-done
60}