63 lines
1.6 KiB
Go
63 lines
1.6 KiB
Go
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()
|
|
p.LastPing = 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
|
|
}
|