package peer import ( "net/netip" "testing" "time" "golang.zx2c4.com/wireguard/wgctrl/wgtypes" "vppn/m" "vppn/peer/multicast" ) // 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) ip := netip.MustParseAddr(vpnIP) a.onAddPeer(m.Peer{ WGPubKey: key, PeerIP: ip.As4()[3], Addr4: ep.Addr(), Port: ep.Port(), Relay: true, }) p := a.peersByKey[key] p.wgPeer.LastHandshakeTime = time.Now() return p } // newTestApp returns a minimal App wired to a fakeWGDevice and fakeControlConn. // 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 bool) (*App, *fakeWGDevice, *fakeControlConn) { t.Helper() privKey, err := wgtypes.GeneratePrivateKey() if err != nil { t.Fatalf("generate key: %v", err) } ip := netip.MustParseAddr(vpnIP) dev := &fakeWGDevice{} cc := &fakeControlConn{} a := &App{ vpnIP: ip, vpnNet: netip.MustParsePrefix("10.0.0.0/24"), privKey: privKey, pubKey: privKey.PublicKey(), isPublic: isPublic, dev: dev, controlConn: cc, peersByKey: make(map[wgtypes.Key]*Peer), peersByIP: make(map[netip.Addr]*Peer), scratch: make([]byte, scratchSize), hubAddCh: make(chan m.Peer), hubRemoveCh: make(chan wgtypes.Key), pingCh: make(chan PingEvent), multicastCh: make(chan multicast.Packet), } return a, dev, cc }