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) } func TestStateClient_onProbe_direct(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigClientDirect(t) h.Sent = h.Sent[:0] probe := controlMsg[packetProbe]{ Packet: packetProbe{ TraceID: newTraceID(), }, } h.OnProbe(probe) assertType[*stateClient](t, h.State) assertEqual(t, len(h.Sent), 0) } func TestStateClient_onProbe_noMatch(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigClientRelayed(t) h.Sent = h.Sent[:0] probe := controlMsg[packetProbe]{ Packet: packetProbe{ TraceID: newTraceID(), }, } h.OnProbe(probe) assertType[*stateClient](t, h.State) assertEqual(t, len(h.Sent), 0) } func TestStateClient_onProbe_directUpgrade(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigClientRelayed(t) state := assertType[*stateClient](t, h.State) traceID := newTraceID() state.probes[traceID] = sentProbe{ SentAt: time.Now(), Addr: addrPort4(1, 2, 3, 4, 500), } probe := controlMsg[packetProbe]{ Packet: packetProbe{TraceID: traceID}, } assertEqual(t, h.Published.Direct, false) h.Sent = h.Sent[:0] h.OnProbe(probe) assertEqual(t, h.Published.Direct, true) assertEqual(t, len(h.Sent), 1) assertType[packetSyn](t, h.Sent[0].Packet) } func TestStateClient_onLocalDiscovery_direct(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigClientDirect(t) h.Sent = h.Sent[:0] pkt := controlMsg[packetLocalDiscovery]{ Packet: packetLocalDiscovery{}, } h.OnLocalDiscovery(pkt) assertType[*stateClient](t, h.State) assertEqual(t, len(h.Sent), 0) } func TestStateClient_onLocalDiscovery_relayed(t *testing.T) { h := NewPeerStateTestHarness() h.ConfigClientRelayed(t) h.Sent = h.Sent[:0] pkt := controlMsg[packetLocalDiscovery]{ SrcAddr: addrPort4(1, 2, 3, 4, 500), Packet: packetLocalDiscovery{}, } h.OnLocalDiscovery(pkt) assertType[*stateClient](t, h.State) assertEqual(t, len(h.Sent), 1) assertType[packetProbe](t, h.Sent[0].Packet) assertEqual(t, h.Sent[0].Peer.DirectAddr, addrPort4(1, 2, 3, 4, 456)) }