summaryrefslogtreecommitdiff
path: root/test/discovery.et
diff options
context:
space:
mode:
Diffstat (limited to 'test/discovery.et')
-rw-r--r--test/discovery.et674
1 files changed, 674 insertions, 0 deletions
diff --git a/test/discovery.et b/test/discovery.et
new file mode 100644
index 0000000..763d6b2
--- /dev/null
+++ b/test/discovery.et
@@ -0,0 +1,674 @@
+module discovery
+
+import attach
+
+def refpat = /blake2#[0-9a-f]*/
+
+test ManualDiscovery:
+ let services = "discovery"
+
+ subnet sd
+ subnet s1
+ subnet s2
+
+ spawn as pd on sd
+ spawn as p1 on s1
+ spawn as p2 on s2
+ send "create-identity Discovery" to pd
+ send "create-identity Device1 Owner1" to p1
+ send "create-identity Device2 Owner2" to p2
+
+ expect /create-identity-done ref ($refpat).*/ from p1 capture p1id
+ send "identity-info $p1id" to p1
+ expect /identity-info ref $p1id base ($refpat) owner ($refpat).*/ from p1 capture p1base, p1owner
+ send "identity-info $p1owner" to p1
+ expect /identity-info ref $p1owner base ($refpat).*/ from p1 capture p1obase
+
+ expect /create-identity-done ref $refpat.*/ from p2
+ expect /create-identity-done ref $refpat.*/ from pd
+
+ # Test discovery using owner and device identities:
+ for id in [ p1obase, p1base ]:
+ for p in [ pd, p1, p2 ]:
+ send "start-server services $services" to p
+ expect from pd /start-server-done/
+
+ for p in [ p1, p2 ]:
+ with p:
+ send "peer-add ${pd.node.ip}"
+ expect:
+ /peer 1 addr ${pd.node.ip} 29665/
+ /peer 1 id Discovery/
+ expect from pd:
+ /peer [12] addr ${p.node.ip} 29665/
+ /peer [12] id .*/
+
+ send "discovery-connect $id" to p2
+
+ expect from p1:
+ /peer [0-9]+ addr ${p2.node.ip} 29665/
+ /peer [0-9]+ id Device2 Owner2/
+ expect from p2:
+ /peer [0-9]+ addr ${p1.node.ip} 29665/
+ /peer [0-9]+ id Device1 Owner1/
+
+ for p in [ pd, p1, p2 ]:
+ send "stop-server" to p
+ for p in [ pd, p1, p2 ]:
+ expect /stop-server-done/ from p
+
+ # Test delayed discovery with new peer
+ for id in [ p1obase ]:
+ for p in [ pd, p1, p2 ]:
+ send "start-server services $services" to p
+ expect from pd /start-server-done/
+
+ with p1:
+ send "peer-add ${pd.node.ip}"
+ expect:
+ /peer 1 addr ${pd.node.ip} 29665/
+ /peer 1 id Discovery/
+ expect from pd:
+ /peer [12] addr ${p1.node.ip} 29665/
+ /peer [12] id Device1 Owner1/
+
+ send "discovery-connect $id" to p2
+
+ with p2:
+ send "peer-add ${pd.node.ip}"
+ expect:
+ /peer 1 addr ${pd.node.ip} 29665/
+ /peer 1 id Discovery/
+ expect from pd:
+ /peer [12] addr ${p2.node.ip} 29665/
+ /peer [12] id Device2 Owner2/
+
+ expect from p1:
+ /peer [0-9]+ addr ${p2.node.ip} 29665/
+ /peer [0-9]+ id Device2 Owner2/
+ expect from p2:
+ /peer [0-9]+ addr ${p1.node.ip} 29665/
+ /peer [0-9]+ id Device1 Owner1/
+
+ for p in [ pd, p1, p2 ]:
+ send "stop-server" to p
+ for p in [ pd, p1, p2 ]:
+ expect /stop-server-done/ from p
+
+
+test DiscoveryJoinedAfter:
+ let services = "discovery"
+
+ subnet sd
+ subnet s1
+ subnet s2
+
+ spawn as pd on sd
+ spawn as p1 on s1
+ spawn as p2 on s2
+ send "create-identity Discovery" to pd
+ send "create-identity Device1 Owner1" to p1
+ send "create-identity Device2 Owner2" to p2
+
+ expect /create-identity-done ref ($refpat).*/ from p1 capture p1id
+ send "identity-info $p1id" to p1
+ expect /identity-info ref $p1id base ($refpat) owner ($refpat).*/ from p1 capture p1base, p1owner
+ send "identity-info $p1owner" to p1
+ expect /identity-info ref $p1owner base ($refpat).*/ from p1 capture p1obase
+
+ expect /create-identity-done ref $refpat.*/ from p2
+ expect /create-identity-done ref $refpat.*/ from pd
+
+ for id in [ p1obase ]:
+ for p in [ pd, p1, p2 ]:
+ send "start-server services $services" to p
+ expect from pd /start-server-done/
+
+ for p in [ p2 ]:
+ with p:
+ send "peer-add ${pd.node.ip}"
+ expect:
+ /peer 1 addr ${pd.node.ip} 29665/
+ /peer 1 id Discovery/
+ expect from pd:
+ /peer [12] addr ${p.node.ip} 29665/
+ /peer [12] id Device. Owner./
+
+ send "discovery-connect $id" to p2
+
+ for p in [ p1 ]:
+ with p:
+ send "peer-add ${pd.node.ip}"
+ expect:
+ /peer 1 addr ${pd.node.ip} 29665/
+ /peer 1 id Discovery/
+ expect from pd:
+ /peer [12] addr ${p.node.ip} 29665/
+ /peer [12] id Device. Owner./
+
+ expect from p1:
+ /peer [0-9]+ addr ${p2.node.ip} 29665/
+ /peer [0-9]+ id Device2 Owner2/
+ expect from p2:
+ /peer [0-9]+ addr ${p1.node.ip} 29665/
+ /peer [0-9]+ id Device1 Owner1/
+
+ for p in [ pd, p1, p2 ]:
+ send "stop-server" to p
+ for p in [ pd, p1, p2 ]:
+ expect /stop-server-done/ from p
+
+
+test DiscoveryTunnel:
+ let services = "discovery:tunnel"
+
+ subnet sd
+ subnet s1
+ subnet s2
+
+ spawn as pd on sd
+ spawn as p1 on s1
+ spawn as p2 on s2
+
+ for n in [ p1.node, p2.node ]:
+ shell on n:
+ nft add table inet filter
+ nft add chain inet filter input '{ type filter hook input priority filter ; policy drop; }'
+ nft add rule inet filter input 'ct state { established, related } accept'
+
+ send "create-identity Discovery" to pd
+ send "create-identity Device1 Owner1" to p1
+ send "create-identity Device2 Owner2" to p2
+
+ expect /create-identity-done ref ($refpat).*/ from p1 capture p1id
+ send "identity-info $p1id" to p1
+ expect /identity-info ref $p1id base ($refpat) owner ($refpat).*/ from p1 capture p1base, p1owner
+ send "identity-info $p1owner" to p1
+ expect /identity-info ref $p1owner base ($refpat).*/ from p1 capture p1obase
+
+ expect /create-identity-done ref $refpat.*/ from p2
+ expect /create-identity-done ref $refpat.*/ from pd
+
+ for id in [ p1obase ]:
+ for p in [ pd, p1, p2 ]:
+ send "start-server services $services test-log" to p
+ expect from pd /start-server-done/
+
+ for p in [ p1, p2 ]:
+ with p:
+ send "peer-add ${pd.node.ip}"
+ expect:
+ /peer 1 addr ${pd.node.ip} 29665/
+ /peer 1 id Discovery/
+ expect from pd:
+ /peer [12] addr ${p.node.ip} 29665/
+ /peer [12] id .*/
+
+ send "discovery-tunnel 1 $id" to p2
+
+ expect /net-ostream-open ${pd.node.ip} 29665 1 1/ from p2
+ expect /net-ostream-open ${p1.node.ip} 29665 1 1/ from pd
+ expect /net-ostream-open ${pd.node.ip} 29665 1 1/ from p1
+ expect /net-ostream-open ${p2.node.ip} 29665 1 1/ from pd
+
+ expect from p1:
+ /peer 2 addr tunnel@.*/
+ /peer 2 id Device2 Owner2/
+ expect from p2:
+ /peer 2 addr tunnel@.*/
+ /peer 2 id Device1 Owner1/
+
+ send "peer-drop 2" to p1
+ send "peer-drop 2" to p2
+
+ expect /net-ostream-close-ack ${pd.node.ip} 29665 1 0/ from p2
+ expect /net-ostream-close-ack ${p1.node.ip} 29665 1 0/ from pd
+ expect /net-ostream-close-ack ${pd.node.ip} 29665 1 0/ from p1
+ expect /net-ostream-close-ack ${p2.node.ip} 29665 1 0/ from pd
+
+ for p in [ pd, p1, p2 ]:
+ send "stop-server" to p
+ for p in [ pd, p1, p2 ]:
+ expect /stop-server-done/ from p
+
+
+test DiscoveryTunnelWithChangedAddresses:
+ let services = "discovery:tunnel"
+
+ subnet sd
+ subnet s1
+ subnet s2
+
+ spawn as pd on sd
+ spawn as p1 on s1
+ spawn as p2 on s2
+
+ for n in [ p1.node, p2.node ]:
+ shell on n:
+ nft add table inet filter
+ nft add chain inet filter input '{ type filter hook input priority filter ; policy drop; }'
+ nft add rule inet filter input 'ct state { established, related } accept'
+
+ send "create-identity Discovery" to pd
+ send "create-identity Device1 Owner1" to p1
+ send "create-identity Device2 Owner2" to p2
+
+ expect /create-identity-done ref ($refpat).*/ from p1 capture p1id
+ send "identity-info $p1id" to p1
+ expect /identity-info ref $p1id base ($refpat) owner ($refpat).*/ from p1 capture p1base, p1owner
+ send "identity-info $p1owner" to p1
+ expect /identity-info ref $p1owner base ($refpat).*/ from p1 capture p1obase
+
+ expect /create-identity-done ref $refpat.*/ from p2
+ expect /create-identity-done ref $refpat.*/ from pd
+
+ for id in [ p1obase ]:
+ send "start-server services $services test-log" to pd
+
+ for p in [ p1, p2 ]:
+ send "start-server services $services test-log" to p
+
+ expect from pd /start-server-done/
+
+ for p in [ p1, p2 ]:
+ with p:
+ send "peer-add ${pd.node.ip}"
+ expect:
+ /peer 1 addr ${pd.node.ip} 29665/
+ /peer 1 id Discovery/
+ expect from pd:
+ /peer [12] addr ${p.node.ip} 29665/
+ /peer [12] id .*/
+
+ send "peer-drop 1" to pd
+ send "peer-drop 2" to pd
+ for p in [ p1, p2 ]:
+ send "stop-server" to p
+ for p in [ p1, p2 ]:
+ shell on p.node as get_default:
+ ip route | grep ^default
+ expect /.* via ([0-9.]+).*/ from get_default capture default_route
+ shell on p.node:
+ ip addr del dev veth0 ${p.node.ip}/24
+ ip addr add dev veth0 ${p.node.ip}0/24
+ ip route add default via ${default_route} dev veth0 src ${p.node.ip}0
+ for p in [ p1, p2 ]:
+ expect /stop-server-done/ from p
+ for p in [ p1, p2 ]:
+ send "start-server services $services test-log" to p
+
+ for p in [ p1, p2 ]:
+ with p:
+ send "peer-add ${pd.node.ip}"
+ expect:
+ /peer 1 addr ${pd.node.ip} 29665/
+ /peer 1 id Discovery/
+ expect from pd:
+ /peer [0-9]+ addr ${p.node.ip}0 29665/
+ /peer [0-9]+ id .*/
+
+ send "discovery-tunnel 1 $id" to p2
+
+ expect /net-ostream-open ${pd.node.ip} 29665 1 1/ from p2
+ expect /net-ostream-open ${p1.node.ip}0 29665 1 1/ from pd
+ expect /net-ostream-open ${pd.node.ip} 29665 1 1/ from p1
+ expect /net-ostream-open ${p2.node.ip}0 29665 1 1/ from pd
+
+ for p in [ pd, p1, p2 ]:
+ send "stop-server" to p
+ for p in [ pd, p1, p2 ]:
+ expect /stop-server-done/ from p
+
+
+test DiscoveryTunnelRefused:
+ let services = "discovery"
+
+ subnet sd
+ subnet s1
+ subnet s2
+
+ spawn as pd on sd
+ spawn as p1 on s1
+ spawn as p2 on s2
+
+ for n in [ p1.node, p2.node ]:
+ shell on n:
+ nft add table inet filter
+ nft add chain inet filter input '{ type filter hook input priority filter ; policy drop; }'
+ nft add rule inet filter input 'ct state { established, related } accept'
+
+ send "create-identity Discovery" to pd
+ send "create-identity Device1 Owner1" to p1
+ send "create-identity Device2 Owner2" to p2
+
+ expect /create-identity-done ref ($refpat).*/ from p1 capture p1id
+ send "identity-info $p1id" to p1
+ expect /identity-info ref $p1id base ($refpat) owner ($refpat).*/ from p1 capture p1base, p1owner
+ send "identity-info $p1owner" to p1
+ expect /identity-info ref $p1owner base ($refpat).*/ from p1 capture p1obase
+
+ expect /create-identity-done ref $refpat.*/ from p2
+ expect /create-identity-done ref $refpat.*/ from pd
+
+ for id in [ p1obase ]:
+ for p in [ pd, p1, p2 ]:
+ send "start-server services $services test-log" to p
+ expect from pd /start-server-done/
+
+ for p in [ p1, p2 ]:
+ with p:
+ send "peer-add ${pd.node.ip}"
+ expect:
+ /peer 1 addr ${pd.node.ip} 29665/
+ /peer 1 id Discovery/
+ expect from pd:
+ /peer [12] addr ${p.node.ip} 29665/
+ /peer [12] id .*/
+
+ send "discovery-tunnel 1 $id" to p2
+ expect /net-ostream-open ${pd.node.ip} 29665 1 1/ from p2
+ expect /net-ostream-close-ack ${pd.node.ip} 29665 1 0/ from p2
+
+ for p in [ pd, p1, p2 ]:
+ send "stop-server" to p
+ for p in [ pd, p1, p2 ]:
+ expect /stop-server-done/ from p
+
+
+test CommonOwnerDiscovery:
+ let services = "discovery:trace"
+
+ subnet sd
+ subnet s1
+ subnet s2
+ subnet s3
+
+ node nd on sd
+ node n1 on s1
+ node n2 on s2
+ node n3 on s3
+
+ # TODO: move under the following "local" and capture values from inner block
+ spawn as p1_init on n1
+ spawn as p2_init on n2
+ spawn as p3_init on n3
+
+ send "create-identity Device1 Owner" to p1_init
+ expect /create-identity-done ref ($refpat).*/ from p1_init capture p1_id_ext
+ send "identity-info $p1_id_ext" to p1_init
+ expect /identity-info ref $p1_id_ext base ($refpat) owner ($refpat).*/ from p1_init capture p1_id, owner_ext
+ send "identity-info $owner_ext" to p1_init
+ expect /identity-info ref $owner_ext base ($refpat).*/ from p1_init capture owner
+
+ local:
+ spawn as pd on nd
+ let p1 = p1_init
+ let p2 = p2_init
+ let p3 = p3_init
+
+ send "create-identity Device2" to p2
+ send "create-identity Device3" to p3
+
+ expect /create-identity-done .*/ from p2
+ expect /create-identity-done .*/ from p3
+
+ send "create-identity Discovery" to pd
+
+ expect /create-identity-done .*/ from pd
+
+ for p in [ p1, p2, p3 ]:
+ send "start-server services attach" to p
+ for p in [ p1, p2, p3 ]:
+ expect /start-server-done/ from p
+ for p in [ p2, p3 ]:
+ send "watch-local-identity" to p
+ send "peer-add ${p1.node.ip} 29665" to p
+ expect /peer [0-9]+ addr ${p1.node.ip} 29665/ from p
+ expect /peer [0-9]+ id .*/ from p
+ perform_attach of p to p1
+
+ expect /local-identity ($refpat) Device. .*/ from p capture p_id_ext
+ send "identity-info $p_id_ext" to p
+
+ for p in [ p1_init, p2_init, p3_init ]:
+ send "stop-server" to p
+ expect /stop-server-done/ from p
+ expect /identity-info ref $refpat base ($refpat).*/ from p2_init capture p2_id
+ expect /identity-info ref $refpat base ($refpat).*/ from p3_init capture p3_id
+
+ local:
+ spawn as pd on nd
+ spawn as p1 on n1
+ spawn as p2 on n2
+ spawn as p3 on n3
+
+ ignore from p1 matching /discovery-packet-result via $refpat addr ICE/
+ ignore from p2 matching /discovery-packet-result via $refpat addr ICE/
+ ignore from p3 matching /discovery-packet-result via $refpat addr ICE/
+
+ # TODO: direct result should be returned only for exact device id match, keep for now
+ ignore from p1 matching /discovery-packet-result result .*/
+ ignore from p2 matching /discovery-packet-result result .*/
+ ignore from p3 matching /discovery-packet-result result .*/
+
+ for p in [ pd, p1, p2, p3 ]:
+ send "start-server services $services" to p
+ expect from pd /start-server-done/
+
+ send "peer-add ${pd.node.ip}" to p1
+ expect from pd /discovery-packet ${p1.node.ip} 29665 search $owner/
+
+ send "peer-add ${pd.node.ip}" to p2
+ expect from pd /discovery-packet ${p2.node.ip} 29665 search $owner/
+
+ expect from p1 /discovery-packet ${pd.node.ip} 29665 result $owner/
+ expect from p1 /discovery-packet-result via ${p2_id} addr ${p2.node.ip} 29665/
+ local:
+ expect from p1 /discovery-packet-result (.*)/ capture done
+ guard (done == done)
+
+ expect from p2 /discovery-packet ${pd.node.ip} 29665 result $owner/
+ expect from p2 /discovery-packet-result via ${p1_id} addr ${p1.node.ip} 29665/
+ local:
+ expect from p2 /discovery-packet-result (.*)/ capture done
+ guard (done == "done")
+
+
+ send "peer-add ${pd.node.ip}" to p3
+ expect from pd /discovery-packet ${p3.node.ip} 29665 search $owner/
+
+ expect from p3 /discovery-packet ${pd.node.ip} 29665 result $owner/
+ expect from p3 /discovery-packet-result via ${p1_id} addr ${p1.node.ip} 29665/
+ expect from p3 /discovery-packet-result via ${p2_id} addr ${p2.node.ip} 29665/
+ local:
+ expect from p3 /discovery-packet-result (.*)/ capture done
+ guard (done == done)
+
+ expect from p1:
+ /peer [0-9]+ addr ${p2.node.ip} 29665/
+ /peer [0-9]+ addr ${p3.node.ip} 29665/
+
+ for p in [ p1, p2 ]:
+ send "stop-server" to p
+ for p in [ p1, p2 ]:
+ expect /stop-server-done/ from p
+ for p in [ p1, p2 ]:
+ send "start-server services $services" to p
+
+ send "peer-add ${pd.node.ip}" to p1
+ send "peer-add ${p3.node.ip}" to p2
+
+ expect from p1:
+ /peer [0-9]+ addr ${pd.node.ip} 29665/
+ /peer [0-9]+ addr ${p2.node.ip} 29665/
+ /peer [0-9]+ addr ${p3.node.ip} 29665/
+
+ expect from p2:
+ /peer [0-9]+ addr ${pd.node.ip} 29665/
+ /peer [0-9]+ addr ${p1.node.ip} 29665/
+ /peer [0-9]+ addr ${p3.node.ip} 29665/
+
+
+test DiscoveryAnyOrder:
+ let services = "discovery"
+
+ subnet sd
+ subnet ss
+ subnet s1
+ subnet s2
+ subnet s3
+ subnet s4
+ subnet s5
+ subnet s6
+
+ spawn on sd as pd
+ spawn on ss as ps # connection order to pd:
+ spawn on s1 as p1 # search - p1 - ps
+ spawn on s2 as p2 # search - ps - p2
+ spawn on s3 as p3 # p3 - search - ps
+ spawn on s4 as p4 # p4 - ps - search
+ spawn on s5 as p5 # ps - p5 - search
+ spawn on s6 as p6 # ps - search - p6
+
+ send "create-identity Discovery" to pd
+ send "create-identity Searching" to ps
+ send "create-identity Device1" to p1
+ send "create-identity Device2" to p2
+ send "create-identity Device3" to p3
+ send "create-identity Device4" to p4
+ send "create-identity Device5" to p5
+ send "create-identity Device6" to p6
+
+ expect /create-identity-done ref $refpat.*/ from pd
+ expect /create-identity-done ref ($refpat).*/ from ps capture ps_id
+ expect /create-identity-done ref ($refpat).*/ from p1 capture p1_id
+ expect /create-identity-done ref ($refpat).*/ from p2 capture p2_id
+ expect /create-identity-done ref ($refpat).*/ from p3 capture p3_id
+ expect /create-identity-done ref ($refpat).*/ from p4 capture p4_id
+ expect /create-identity-done ref ($refpat).*/ from p5 capture p5_id
+ expect /create-identity-done ref ($refpat).*/ from p6 capture p6_id
+
+ send "start-server services $services" to pd
+ # wait for the first server to start and claim the discovery port
+ expect /start-server-done/ from pd
+
+ for p in [ ps, p1, p2, p3, p4, p5, p6 ]:
+ send "start-server services $services" to p
+ for p in [ ps, p1, p2, p3, p4, p5, p6 ]:
+ expect /start-server-done/ from p
+
+ send "discovery-connect $p1_id" to ps
+ send "discovery-connect $p2_id" to ps
+
+ send "peer-add ${pd.node.ip} 29665" to p1
+ send "peer-add ${pd.node.ip} 29665" to p3
+ send "peer-add ${pd.node.ip} 29665" to p4
+ expect /peer [0-9]+ id Discovery/ from p1
+ expect /peer [0-9]+ id Discovery/ from p3
+ expect /peer [0-9]+ id Discovery/ from p4
+
+ send "discovery-connect $p3_id" to ps
+
+ send "peer-add ${pd.node.ip} 29665" to ps
+ expect /peer [0-9]+ id Discovery/ from ps
+
+ expect /peer [0-9]+ id Device1/ from ps
+ expect /peer [0-9]+ id Device3/ from ps
+
+ send "peer-add ${pd.node.ip} 29665" to p2
+ expect /peer [0-9]+ id Device2/ from ps
+
+ send "discovery-connect $p4_id" to ps
+ expect /peer [0-9]+ id Device4/ from ps
+
+ send "peer-add ${pd.node.ip} 29665" to p5
+ expect /peer [0-9]+ id Discovery/ from p5
+
+ send "discovery-connect $p5_id" to ps
+ send "discovery-connect $p6_id" to ps
+ expect /peer [0-9]+ id Device5/ from ps
+
+ send "peer-add ${pd.node.ip} 29665" to p6
+ expect /peer [0-9]+ id Discovery/ from p6
+ expect /peer [0-9]+ id Device6/ from ps
+
+
+test DiscoveryOnLocalhost:
+ let services = "discovery"
+ node n
+
+ # TODO: some way to have node without any connection
+ shell on n:
+ ip link set dev ${n.ifname} down
+
+ spawn on n:
+ as pd
+ as ps # connection order to pd:
+ as p1 # search - p1 - ps
+ as p2 # search - ps - p2
+ as p3 # p3 - search - ps
+ as p4 # p4 - ps - search
+ as p5 # ps - p5 - search
+ as p6 # ps - search - p6
+
+ send "create-identity Discovery" to pd
+ send "create-identity Searching" to ps
+ send "create-identity Device1" to p1
+ send "create-identity Device2" to p2
+ send "create-identity Device3" to p3
+ send "create-identity Device4" to p4
+ send "create-identity Device5" to p5
+ send "create-identity Device6" to p6
+
+ expect /create-identity-done ref $refpat.*/ from pd
+ expect /create-identity-done ref ($refpat).*/ from ps capture ps_id
+ expect /create-identity-done ref ($refpat).*/ from p1 capture p1_id
+ expect /create-identity-done ref ($refpat).*/ from p2 capture p2_id
+ expect /create-identity-done ref ($refpat).*/ from p3 capture p3_id
+ expect /create-identity-done ref ($refpat).*/ from p4 capture p4_id
+ expect /create-identity-done ref ($refpat).*/ from p5 capture p5_id
+ expect /create-identity-done ref ($refpat).*/ from p6 capture p6_id
+
+ send "start-server services $services" to pd
+ # wait for the first server to start and claim the discovery port
+ expect /start-server-done/ from pd
+
+ for p in [ ps, p1, p2, p3, p4, p5, p6 ]:
+ send "start-server services $services" to p
+ for p in [ ps, p1, p2, p3, p4, p5, p6 ]:
+ expect /start-server-done/ from p
+
+ send "discovery-connect $p1_id" to ps
+ send "discovery-connect $p2_id" to ps
+
+ send "peer-add localhost" to p1
+ send "peer-add localhost" to p3
+ send "peer-add localhost" to p4
+ expect /peer [0-9]+ id Discovery/ from p1
+ expect /peer [0-9]+ id Discovery/ from p3
+ expect /peer [0-9]+ id Discovery/ from p4
+
+ send "discovery-connect $p3_id" to ps
+
+ send "peer-add localhost" to ps
+ expect /peer [0-9]+ id Discovery/ from ps
+
+ expect /peer [0-9]+ id Device1/ from ps
+ expect /peer [0-9]+ id Device3/ from ps
+
+ send "peer-add localhost" to p2
+ expect /peer [0-9]+ id Device2/ from ps
+
+ send "discovery-connect $p4_id" to ps
+ expect /peer [0-9]+ id Device4/ from ps
+
+ send "peer-add localhost" to p5
+ expect /peer [0-9]+ id Discovery/ from p5
+
+ send "discovery-connect $p5_id" to ps
+ send "discovery-connect $p6_id" to ps
+ expect /peer [0-9]+ id Device5/ from ps
+
+ send "peer-add localhost" to p6
+ expect /peer [0-9]+ id Discovery/ from p6
+ expect /peer [0-9]+ id Device6/ from ps