1package broker
2
3import (
4 "context"
5 "testing"
6 "time"
7
8 "github.com/bnema/vev/internal/domain"
9 "github.com/bnema/vev/internal/ports"
10 "github.com/stretchr/testify/require"
11)
12
13// TestRegistryLookupHostDeepCopyAndCancel pins the committed-authority read
14// seam: a lookup returns a defensive deep copy of durable routing authority (so
15// a caller cannot alias the registry's record through the route's argv), a
16// cancelled context is refused before authority is consulted, and an unknown
17// endpoint reports absence without an error.
18func TestRegistryLookupHostDeepCopyAndCancel(t *testing.T) {
19 clock := newManualClock(time.Unix(100, 0))
20 registry := newTestRegistry(t, 1, newTestStore(), newTestProbe(1), clock)
21 reg := registration(t, "user@host:22", 1)
22 require.NoError(t, registry.ReplaceHosts(hostRecords(reg)))
23
24 want := hostRecord(reg)
25 got, found, err := registry.LookupHost(context.Background(), reg.Endpoint)
26 require.NoError(t, err)
27 require.True(t, found)
28 require.Equal(t, want, got)
29 require.Equal(t, canonicalRoute(poolPolicy(), reg.Endpoint), got.Route)
30
31 // Mutating the returned copy touches nothing: the route's argv never aliases
32 // registry authority, and neither do the value fields.
33 got.Route.Argv[0] = "mutated"
34 got.Policy.Trust = "mutated"
35 got.Registration.Generation = 99
36 got.Identity = "mutated"
37 again, found, err := registry.LookupHost(context.Background(), reg.Endpoint)
38 require.NoError(t, err)
39 require.True(t, found)
40 require.Equal(t, want, again, "the returned record is a deep copy of authority")
41
42 cancelled, cancel := context.WithCancel(context.Background())
43 cancel()
44 absent, found, err := registry.LookupHost(cancelled, reg.Endpoint)
45 require.ErrorIs(t, err, context.Canceled)
46 require.False(t, found)
47 require.Equal(t, ports.BrokerHostRecord{}, absent)
48
49 missing, found, err := registry.LookupHost(context.Background(), "user@absent:22")
50 require.NoError(t, err)
51 require.False(t, found)
52 require.Equal(t, ports.BrokerHostRecord{}, missing)
53
54 // The refused lookups never moved authority.
55 require.Equal(t, []ports.BrokerHostRecord{want}, registry.authority.Hosts)
56 require.Equal(t, domain.RemoteRegistration{}, missing.Registration)
57}