97 lines
2.5 KiB
Python
97 lines
2.5 KiB
Python
# @TEST-GROUP: native
|
|
#
|
|
# @TEST-PORT: BROKER_PORT
|
|
#
|
|
# @TEST-COPY-FILE: ${SCRIPTS}/wire_format.py
|
|
#
|
|
# @TEST-EXEC: btest-bg-run node "broker-node --config-file=../node.cfg"
|
|
# @TEST-EXEC: btest-bg-run peer "python3 ../peer.py >peer.out"
|
|
#
|
|
# @TEST-EXEC: $SCRIPTS/wait-for-file peer/done 30 || (btest-bg-wait -k 1 && false)
|
|
# @TEST-EXEC: btest-diff peer/peer.out
|
|
# @TEST-EXEC: btest-bg-wait -k 1
|
|
|
|
@TEST-START-FILE node.cfg
|
|
|
|
broker {
|
|
disable-ssl = true
|
|
}
|
|
caf {
|
|
logger {
|
|
file {
|
|
path = 'broker.log'
|
|
verbosity = 'debug'
|
|
}
|
|
}
|
|
}
|
|
topics = ["/test"]
|
|
verbose = true
|
|
|
|
@TEST-END-FILE
|
|
|
|
@TEST-START-FILE peer.py
|
|
|
|
import os, sys, socket, uuid, time
|
|
|
|
sys.path.insert(0, '..')
|
|
|
|
from wire_format import *
|
|
|
|
port = int(os.environ['BROKER_PORT'].split('/')[0])
|
|
|
|
# The smallest possible version-4 UUID to make sure we are the originator.
|
|
this_peer = uuid.UUID('00000000-0000-4000-8000-000000000000')
|
|
|
|
# The handshake sequence is:
|
|
# <- probe
|
|
# -> hello
|
|
# <- hello (since we have a smaller ID)
|
|
# -> version_select
|
|
# -> originator_syn_msg
|
|
# <- responder_syn_ack
|
|
# -> originator_ack
|
|
#
|
|
# After that, the peering is established and we do one round of ping-pong:
|
|
# -> ping
|
|
# <- pong (same payload)
|
|
|
|
def run(fd):
|
|
# <- probe
|
|
(tag, msg) = read_hs_msg(fd)
|
|
check_eq(tag, MessageType.PROBE)
|
|
check_eq(msg.magic, magic_number())
|
|
# -> hello
|
|
write_hs_msg(fd, MessageType.HELLO, pack_hello(this_peer, 1, 99))
|
|
# <- hello
|
|
(tag, msg) = read_hs_msg(fd)
|
|
check_eq(tag, MessageType.HELLO)
|
|
check_eq(msg.magic, magic_number())
|
|
check_eq(msg.min_version, 1)
|
|
check_eq(msg.max_version, 1)
|
|
peer_id = msg.sender_id
|
|
# -> version_select
|
|
write_hs_msg(fd, MessageType.VERSION_SELECT, pack_version_select(this_peer, 1))
|
|
# -> originator_syn_msg
|
|
write_hs_msg(fd, MessageType.ORIGINATOR_SYN, pack_originator_syn(['/foo/bar']))
|
|
# <- responder_syn_ack
|
|
(tag, msg) = read_hs_msg(fd)
|
|
check_eq(tag, MessageType.RESPONDER_SYN_ACK)
|
|
check_eq(msg.subscriptions, ['/test'])
|
|
# -> originator_ack
|
|
write_hs_msg(fd, MessageType.ORIGINATOR_ACK, pack_originator_ack())
|
|
# -> ping("foo")
|
|
write_op_msg(fd, this_peer, peer_id, MessageType.PING, '<$>',
|
|
pack_ping("foo".encode()))
|
|
# <- pong("foo")
|
|
(tag, msg) = read_op_msg(fd)
|
|
check_eq(tag, MessageType.PONG)
|
|
check_eq(msg.sender_id, peer_id)
|
|
check_eq(msg.receiver_id, this_peer)
|
|
check_eq(msg.topic, '<$>')
|
|
check_eq(msg.payload.decode(), 'foo')
|
|
|
|
|
|
test_main("localhost", port, run)
|
|
|
|
@TEST-END-FILE
|