gintro/examples/gtk3/libnice_simple_test.nim
Stefan Salewski ad70b68564 v0.8.4
2020-12-16 12:30:35 +01:00

139 lines
4.7 KiB
Nim

## This test program was kindly provided by Mr. Tomohiro, see
## https://github.com/StefanSalewski/gintro/issues/99
# nim c libnice_simple_test.nim
#
# Test code for libnice.
# If test succeeded, it prints "Test success".
# You don't need to run 2 processes of this program to test.
when (compiles do: import gintro/gtk):
import gintro/[gtk, glib, gobject, gio, nice]
else:
import gintro/[dummygtk, glib, gobject, gio, nice] # For system has glib but no gtk
import strformat, nativesockets
const
ltestMessage = "some test message"
rtestMessage = "random text for test"
var
gloop: glib.MainLoop
lagent, ragent: nice.Agent
lstreamId, rstreamId: int
gatheringCount, recvCount: int
proc toIntVal(i: int): Value =
let gtype = typeFromName("gint")
discard init(result, gtype)
setInt(result, i)
proc addrString(niceAddr: Address): string =
getAddrString(unsafeAddr niceAddr.`addr`)
proc cbCandidateGatheringDone(agent: nice.Agent; streamId: int) =
proc copyCandidates(src, dst: nice.Agent; srcStreamId, dstStreamId: int) =
var
ufrag: string
password: string
doAssert src.getLocalCredentials(srcStreamId, ufrag, password)
doAssert dst.setRemoteCredentials(dstStreamId, ufrag, password)
var cands: seq[Candidate] = src.getLocalCandidates(srcStreamId, 1)
for c in cands.mitems:
c.setStreamID(dstStreamId.uint32)
c.setComponentID(1)
doAssert cands.len != 0
doAssert dst.setRemoteCandidates(dstStreamId, 1, cands) > 0
doAssert agent == lagent or agent == ragent
doAssert gatheringCount in (0..1)
if gatheringCount == 1:
copyCandidates(lagent, ragent, lstreamId, rstreamId)
copyCandidates(ragent, lagent, rstreamId, lstreamId)
inc gatheringCount
proc cbNewSelectedPairFull(self: Agent; streamId: int; componentId: int; lcandidate: Candidate; rcandidate: Candidate) =
echo &"SIGNAL: selected pair ({lcandidate.impl.`addr`.addrString}:{lcandidate.impl.`addr`.port} {rcandidate.impl.`addr`.addrString}:{rcandidate.impl.`addr`.port})"
proc cbComponentStateChanged(agent: nice.Agent; streamId: int; componentId: int; state: int) =
doAssert agent == lagent or agent == ragent
let stat = ComponentState(state)
echo &"SIGNAL: state changed {streamId}, {componentId}, {stat}"
case stat
of ComponentState.connected:
var
local = Candidate(ignoreFinalizer: true)
remote = Candidate(ignoreFinalizer: true)
## Get current selected candidate pair and print IP address used
if getSelectedPair(agent, streamId, componentId, local, remote):
echo &"Negotiation complete: ({local.impl.`addr`.addrString}:{local.impl.`addr`.port} {remote.impl.`addr`.addrString}:{remote.impl.`addr`.port})"
of ComponentState.ready:
if agent == lagent:
doAssert agent.send(streamId, componentId, ltestMessage.len, ltestMessage.cstring) == ltestMessage.len
else:
doAssert agent.send(streamId, componentId, rtestMessage.len, rtestMessage.cstring) == rtestMessage.len
of ComponentState.failed:
gloop.quit
else:
discard
proc cbNiceRecv(agent: nice.Agent; streamID: cuint; componentID: cuint; len: cuint; buf: cstring) =
doAssert agent.impl == lagent.impl or agent.impl == ragent.impl
if agent.impl == lagent.impl:
doAssert len == rtestMessage.len
doAssert equalMem(buf, rtestMessage.cstring, len)
echo "lagent received test message"
else:
doAssert len == ltestMessage.len
doAssert equalMem(buf, ltestMessage.cstring, len)
echo "ragent received test message"
doAssert recvCount in (0..1)
if recvCount == 1:
gloop.quit
inc recvCount
proc main =
gio.networkingInit()
gloop = newMainLoop(nil, false)
lagent = nice.newAgent(glib.getContext(gloop), nice.CompatibilityRfc5245)
ragent = nice.newAgent(glib.getContext(gloop), nice.CompatibilityRfc5245)
doAssert lagent != nil and ragent != nil
lagent.setProperty("controlling-mode", toIntVal(0))
ragent.setProperty("controlling-mode", toIntVal(1))
lagent.connect("candidate-gathering-done", cbCandidateGatheringDone)
ragent.connect("candidate-gathering-done", cbCandidateGatheringDone)
lagent.connect("new-selected-pair-full", cbNewSelectedPairFull)
ragent.connect("new-selected-pair-full", cbNewSelectedPairFull)
lagent.connect("component-state-changed", cbComponentStateChanged)
ragent.connect("component-state-changed", cbComponentStateChanged)
lstreamId = lagent.addStream(1)
rstreamId = ragent.addStream(1)
doAssert lstreamId != 0 and rstreamId != 0
lagent.attachRecv(lstreamId.cuint, 1, getContext(gloop), cbNiceRecv)
ragent.attachRecv(rstreamId.cuint, 1, getContext(gloop), cbNiceRecv)
doAssert gatherCandidates(lagent, lstreamId)
doAssert gatherCandidates(ragent, rstreamId)
gloop.run
doAssert gatheringCount == 2
doAssert recvCount == 2
echo "Test success"
main()