package peer import ( "testing" "time" ) func TestStateClient_peerUpdate(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigClientDirect(t) h.PeerUpdate(nil) assertType[*stateDisconnected](t, h.State) } func TestStateClient_initialPackets(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigClientDirect(t) assertEqual(t, len(h.Sent), 2) assertType[packetInit](t, h.Sent[0].Packet) assertType[packetSyn](t, h.Sent[1].Packet) } func TestStateClient_onAck_incorrectTraceID(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigClientDirect(t) h.Sent = h.Sent[:0] ack := controlMsg[packetAck]{ Packet: packetAck{TraceID: newTraceID()}, } h.OnAck(ack) // Nothing should have happened. assertType[*stateClient](t, h.State) assertEqual(t, len(h.Sent), 0) } func TestStateClient_onAck_direct_downToUp(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigClientDirect(t) assertEqual(t, len(h.Sent), 2) syn := assertType[packetSyn](t, h.Sent[1].Packet) h.Sent = h.Sent[:0] assertEqual(t, h.Published.Up, false) ack := controlMsg[packetAck]{ Packet: packetAck{TraceID: syn.TraceID}, } h.OnAck(ack) assertEqual(t, len(h.Sent), 0) } func TestStateClient_onAck_relayed_sendsProbes(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigClientRelayed(t) assertEqual(t, len(h.Sent), 2) syn := assertType[packetSyn](t, h.Sent[1].Packet) h.Sent = h.Sent[:0] assertEqual(t, h.Published.Up, false) ack := controlMsg[packetAck]{ Packet: packetAck{TraceID: syn.TraceID}, } ack.Packet.PossibleAddrs[0] = addrPort4(1, 2, 3, 4, 100) ack.Packet.PossibleAddrs[1] = addrPort4(2, 3, 4, 5, 200) h.OnAck(ack) assertEqual(t, len(h.Sent), 2) assertType[packetProbe](t, h.Sent[0].Packet) assertEqual(t, h.Sent[0].Peer.DirectAddr, ack.Packet.PossibleAddrs[0]) assertType[packetProbe](t, h.Sent[1].Packet) assertEqual(t, h.Sent[1].Peer.DirectAddr, ack.Packet.PossibleAddrs[1]) } func TestStateClient_onPing(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigClientRelayed(t) h.Sent = h.Sent[:0] h.OnPingTimer() assertEqual(t, len(h.Sent), 1) assertType[*stateClient](t, h.State) assertType[packetSyn](t, h.Sent[0].Packet) } func TestStateClient_onPing_timeout(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigClientRelayed(t) h.Sent = h.Sent[:0] state := assertType[*stateClient](t, h.State) state.lastSeen = time.Now().Add(-2 * timeoutInterval) state.staged.Up = true h.OnPingTimer() newState := assertType[*stateClientInit](t, h.State) assertEqual(t, newState.staged.Up, false) assertEqual(t, len(h.Sent), 1) assertType[packetInit](t, h.Sent[0].Packet) } // probe direct // probe relayed - no match // probe relayed - match