mirror of
https://github.com/logos-storage/logos-storage-nim.git
synced 2026-07-24 10:33:16 +00:00
72 lines
2.7 KiB
Nim
72 lines
2.7 KiB
Nim
import std/[unittest, net, options]
|
|
import pkg/chronos
|
|
import pkg/libp2p/[multiaddress, multihash, multicodec]
|
|
import pkg/results
|
|
|
|
import ../../storage/nat {.all.}
|
|
import ../../storage/utils
|
|
import ../../storage/utils/natutils
|
|
|
|
suite "NAT Address Tests":
|
|
test "nattedAddress with local addresses":
|
|
# Setup test data
|
|
let
|
|
udpPort = Port(1234)
|
|
natConfig = NatConfig(hasExtIp: true, extIp: parseIpAddress("8.8.8.8"))
|
|
|
|
# Create test addresses
|
|
localAddr = MultiAddress.init("/ip4/127.0.0.1/tcp/5000").expect("valid multiaddr")
|
|
anyAddr = MultiAddress.init("/ip4/0.0.0.0/tcp/5000").expect("valid multiaddr")
|
|
publicAddr =
|
|
MultiAddress.init("/ip4/192.168.1.1/tcp/5000").expect("valid multiaddr")
|
|
|
|
# Expected results
|
|
let
|
|
expectedDiscoveryAddrs = @[
|
|
MultiAddress.init("/ip4/8.8.8.8/udp/1234").expect("valid multiaddr"),
|
|
MultiAddress.init("/ip4/8.8.8.8/udp/1234").expect("valid multiaddr"),
|
|
MultiAddress.init("/ip4/8.8.8.8/udp/1234").expect("valid multiaddr"),
|
|
]
|
|
expectedlibp2pAddrs = @[
|
|
MultiAddress.init("/ip4/8.8.8.8/tcp/5000").expect("valid multiaddr"),
|
|
MultiAddress.init("/ip4/8.8.8.8/tcp/5000").expect("valid multiaddr"),
|
|
MultiAddress.init("/ip4/8.8.8.8/tcp/5000").expect("valid multiaddr"),
|
|
]
|
|
|
|
#ipv6Addr = MultiAddress.init("/ip6/::1/tcp/5000").expect("valid multiaddr")
|
|
addrs = @[localAddr, anyAddr, publicAddr]
|
|
|
|
# Test address remapping
|
|
let (libp2pAddrs, discoveryAddrs) = nattedAddress(natConfig, addrs, udpPort)
|
|
|
|
# Verify results
|
|
check(discoveryAddrs == expectedDiscoveryAddrs)
|
|
check(libp2pAddrs == expectedlibp2pAddrs)
|
|
|
|
suite "NAT restart safety":
|
|
test "setupNat does not crash when extIp is cached from a previous start":
|
|
# Reproduces the restart crash (SIGSEGV) seen with nat=upnp.
|
|
#
|
|
# After a first start, extIp was cached and upnp was initialised.
|
|
# After a stop, extIp was still cached, but upnp was not initialised because
|
|
# the thread was destroyed using the destroy function.
|
|
# As a result, the next start crashed in setupNat when it tried to do port mapping
|
|
# because getExternalIp wasn't called anymore (it was cached) and upnp was not initialised.
|
|
extIp = some(parseIpAddress("1.2.3.4"))
|
|
strategy = NatStrategy.NatUpnp
|
|
|
|
let res = setupNat(NatStrategy.NatUpnp, Port(8500), Port(8500), "storage")
|
|
check res.tcpPort.isSome
|
|
|
|
test "stopNat resets NAT state so the next start is clean":
|
|
# Simulates leftover state
|
|
extIp = some(parseIpAddress("1.2.3.4"))
|
|
strategy = NatStrategy.NatNone
|
|
activeMappings.add(PortMappings())
|
|
|
|
stopNat()
|
|
|
|
check extIp.isNone
|
|
check activeMappings.len == 0
|
|
check natThreads.len == 0
|