package peer import ( "net/netip" "testing" "time" "golang.zx2c4.com/wireguard/wgctrl/wgtypes" ) // addRelayPeer adds a public relay peer and marks it Up so it satisfies // CanRelay. It does not set a.relay — callers do that explicitly. func addRelayPeer(t *testing.T, a *App, vpnIP string, ep netip.AddrPort) *Peer { t.Helper() key := mustKey(t) a.onAddPeer(HubPeer{ PubKey: key, VPNIP: netip.MustParseAddr(vpnIP), IsPublic: true, IsRelay: true, EndpointV4: ep, }) p := a.peersByKey[key] p.wgPeer.LastHandshakeTime = time.Now() return p } // newTestApp returns a minimal App wired to a fakeWGDevice. // vpnIP is the local VPN address (e.g. "10.0.0.1"). // isPublic / isRelay describe the local node's role. func newTestApp(t *testing.T, vpnIP string, isPublic, isRelay bool) (*App, *fakeWGDevice) { t.Helper() privKey, err := wgtypes.GeneratePrivateKey() if err != nil { t.Fatalf("generate key: %v", err) } ip := netip.MustParseAddr(vpnIP) dev := &fakeWGDevice{} a := &App{ vpnIP: ip, vpnNet: netip.MustParsePrefix("10.0.0.0/24"), privKey: privKey, pubKey: privKey.PublicKey(), isPublic: isPublic, isRelay: isRelay, dev: dev, peersByKey: make(map[wgtypes.Key]*Peer), peersByIP: make(map[netip.Addr]*Peer), hubAddCh: make(chan HubPeer), hubRemoveCh: make(chan wgtypes.Key), pingCh: make(chan PingEvent), multicastCh: make(chan MulticastEvent), } return a, dev }