package peer import ( "testing" "time" ) func TestStateServer_peerUpdate(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigServer_Public(t) h.PeerUpdate(nil) assertType[*stateDisconnected](t, h.State) } func TestStateServer_onInit(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigServer_Public(t) msg := controlMsg[packetInit]{ SrcIP: 3, SrcAddr: addrPort4(1, 2, 3, 4, 1000), Packet: packetInit{ TraceID: newTraceID(), Direct: true, Version: 4, }, } h.OnInit(msg) assertEqual(t, len(h.Sent), 1) assertEqual(t, h.Sent[0].Peer.DirectAddr, msg.SrcAddr) resp := assertType[packetInit](t, h.Sent[0].Packet) assertEqual(t, msg.Packet.TraceID, resp.TraceID) assertEqual(t, resp.Version, version) } func TestStateServer_onSynDirect(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigServer_Public(t) msg := controlMsg[packetSyn]{ SrcIP: 3, SrcAddr: addrPort4(1, 2, 3, 4, 1000), Packet: packetSyn{ TraceID: newTraceID(), Direct: true, }, } msg.Packet.PossibleAddrs[0] = addrPort4(1, 1, 1, 1, 1000) msg.Packet.PossibleAddrs[1] = addrPort4(1, 1, 1, 2, 2000) h.OnSyn(msg) assertEqual(t, len(h.Sent), 1) assertEqual(t, h.Sent[0].Peer.DirectAddr, msg.SrcAddr) resp := assertType[packetAck](t, h.Sent[0].Packet) assertEqual(t, msg.Packet.TraceID, resp.TraceID) } func TestStateServer_onSynRelayed(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigServer_Relayed(t) msg := controlMsg[packetSyn]{ SrcIP: 3, SrcAddr: addrPort4(1, 2, 3, 4, 1000), Packet: packetSyn{ TraceID: newTraceID(), }, } msg.Packet.PossibleAddrs[0] = addrPort4(1, 1, 1, 1, 1000) msg.Packet.PossibleAddrs[1] = addrPort4(1, 1, 1, 2, 2000) h.OnSyn(msg) assertEqual(t, len(h.Sent), 3) assertEqual(t, h.Sent[0].Peer.DirectAddr, msg.SrcAddr) resp := assertType[packetAck](t, h.Sent[0].Packet) assertEqual(t, msg.Packet.TraceID, resp.TraceID) for i, pkt := range h.Sent[1:] { assertEqual(t, pkt.Peer.DirectAddr, msg.Packet.PossibleAddrs[i]) assertType[packetProbe](t, pkt.Packet) } } func TestStateServer_onProbe(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigServer_Relayed(t) msg := controlMsg[packetProbe]{ SrcIP: 3, Packet: packetProbe{ TraceID: newTraceID(), }, } h.Sent = h.Sent[:0] h.OnProbe(msg) assertEqual(t, len(h.Sent), 0) } func TestStateServer_onProbe_valid(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigServer_Relayed(t) msg := controlMsg[packetProbe]{ SrcIP: 3, SrcAddr: addrPort4(1, 2, 3, 4, 100), Packet: packetProbe{ TraceID: newTraceID(), }, } h.Sent = h.Sent[:0] h.OnProbe(msg) assertEqual(t, len(h.Sent), 1) assertType[packetProbe](t, h.Sent[0].Packet) assertEqual(t, h.Sent[0].Peer.DirectAddr, msg.SrcAddr) } func TestStateServer_onPing(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigServer_Relayed(t) h.Sent = h.Sent[:0] h.OnPingTimer() assertEqual(t, len(h.Sent), 0) assertType[*stateServer](t, h.State) } func TestStateServer_onPing_timeout(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigServer_Relayed(t) h.Sent = h.Sent[:0] state := assertType[*stateServer](t, h.State) state.staged.Up = true state.lastSeen = time.Now().Add(-2 * timeoutInterval) h.OnPingTimer() state = assertType[*stateServer](t, h.State) assertEqual(t, len(h.Sent), 0) assertEqual(t, state.staged.Up, false) } func TestStateServer_onLocalDiscovery(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigServer_Relayed(t) msg := controlMsg[packetLocalDiscovery]{ SrcIP: 3, SrcAddr: addrPort4(1, 2, 3, 4, 100), } h.OnLocalDiscovery(msg) assertType[*stateServer](t, h.State) } func TestStateServer_onAck(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigServer_Relayed(t) msg := controlMsg[packetAck]{} h.OnAck(msg) assertType[*stateServer](t, h.State) }