test Discovery:
	spawn as p1
	spawn as p2
	send "create-identity Device1 Owner" to p1
	send "create-identity Device2" to p2
	send "start-server" to p1
	send "start-server" to p2
	expect from p1:
		/peer 1 addr ${p2.node.ip} 29665/
		/peer 1 id Device2/
	expect from p2:
		/peer 1 addr ${p1.node.ip} 29665/
		/peer 1 id Device1 Owner/

	send "update-local-identity Device1A" to p1
	expect /peer 1 id Device1A Owner/ from p2

	send "update-shared-identity OwnerA" to p1
	expect /peer 1 id Device1A OwnerA/ from p2

	send "update-local-identity Device1B" to p1
	expect /peer 1 id Device1B OwnerA/ from p2

	send "update-shared-identity OwnerB" to p1
	expect /peer 1 id Device1B OwnerB/ from p2

	with p2:
		send "stop-server"
		expect /stop-server-done/

	send "update-shared-identity OwnerC" to p1

	with p1:
		send "stop-server"
		expect /stop-server-done/

	spawn as p3
	spawn as p4
	spawn as p5
	spawn as p6
	send "create-identity Device3" to p3
	send "create-identity Device4" to p4
	send "create-identity Device5" to p5
	send "create-identity Device6" to p6

	for p in [ p1, p2, p3, p4, p5, p6 ]:
		send "start-server" to p

	expect from p1:
		/peer ([0-9]+) addr ${p2.node.ip} 29665/ capture peer1_2
		/peer $peer1_2 id Device2/
		/peer ([0-9]+) addr ${p3.node.ip} 29665/ capture peer1_3
		/peer $peer1_3 id Device3/
		/peer ([0-9]+) addr ${p4.node.ip} 29665/ capture peer1_4
		/peer $peer1_4 id Device4/
		/peer ([0-9]+) addr ${p5.node.ip} 29665/ capture peer1_5
		/peer $peer1_5 id Device5/
		/peer ([0-9]+) addr ${p6.node.ip} 29665/ capture peer1_6
		/peer $peer1_6 id Device6/

	expect from p2:
		/peer ([0-9]+) addr ${p1.node.ip} 29665/ capture peer2_1
		/peer $peer2_1 id Device1B OwnerC/
		/peer ([0-9]+) addr ${p3.node.ip} 29665/ capture peer2_3
		/peer $peer2_3 id Device3/
		/peer ([0-9]+) addr ${p4.node.ip} 29665/ capture peer2_4
		/peer $peer2_4 id Device4/
		/peer ([0-9]+) addr ${p5.node.ip} 29665/ capture peer2_5
		/peer $peer2_5 id Device5/
		/peer ([0-9]+) addr ${p6.node.ip} 29665/ capture peer2_6
		/peer $peer2_6 id Device6/

	expect from p3:
		/peer ([0-9]+) addr ${p1.node.ip} 29665/ capture peer3_1
		/peer $peer3_1 id Device1B OwnerC/
		/peer ([0-9]+) addr ${p2.node.ip} 29665/ capture peer3_2
		/peer $peer3_2 id Device2/
		/peer ([0-9]+) addr ${p4.node.ip} 29665/ capture peer3_4
		/peer $peer3_4 id Device4/
		/peer ([0-9]+) addr ${p5.node.ip} 29665/ capture peer3_5
		/peer $peer3_5 id Device5/
		/peer ([0-9]+) addr ${p6.node.ip} 29665/ capture peer3_6
		/peer $peer3_6 id Device6/

	expect from p4:
		/peer ([0-9]+) addr ${p1.node.ip} 29665/ capture peer4_1
		/peer $peer4_1 id Device1B OwnerC/
		/peer ([0-9]+) addr ${p2.node.ip} 29665/ capture peer4_2
		/peer $peer4_2 id Device2/
		/peer ([0-9]+) addr ${p3.node.ip} 29665/ capture peer4_3
		/peer $peer4_3 id Device3/
		/peer ([0-9]+) addr ${p5.node.ip} 29665/ capture peer4_5
		/peer $peer4_5 id Device5/
		/peer ([0-9]+) addr ${p6.node.ip} 29665/ capture peer4_6
		/peer $peer4_6 id Device6/

	expect from p5:
		/peer ([0-9]+) addr ${p1.node.ip} 29665/ capture peer5_1
		/peer $peer5_1 id Device1B OwnerC/
		/peer ([0-9]+) addr ${p2.node.ip} 29665/ capture peer5_2
		/peer $peer5_2 id Device2/
		/peer ([0-9]+) addr ${p3.node.ip} 29665/ capture peer5_3
		/peer $peer5_3 id Device3/
		/peer ([0-9]+) addr ${p4.node.ip} 29665/ capture peer5_4
		/peer $peer5_4 id Device4/
		/peer ([0-9]+) addr ${p6.node.ip} 29665/ capture peer5_6
		/peer $peer5_6 id Device6/

	expect from p6:
		/peer ([0-9]+) addr ${p1.node.ip} 29665/ capture peer6_1
		/peer $peer6_1 id Device1B OwnerC/
		/peer ([0-9]+) addr ${p2.node.ip} 29665/ capture peer6_2
		/peer $peer6_2 id Device2/
		/peer ([0-9]+) addr ${p3.node.ip} 29665/ capture peer6_3
		/peer $peer6_3 id Device3/
		/peer ([0-9]+) addr ${p4.node.ip} 29665/ capture peer6_4
		/peer $peer6_4 id Device4/
		/peer ([0-9]+) addr ${p5.node.ip} 29665/ capture peer6_5
		/peer $peer6_5 id Device5/


test LargeData:
	spawn as p1
	spawn as p2
	send "create-identity Device1" to p1
	send "create-identity Device2" to p2
	send "start-server" to p1
	send "start-server" to p2
	expect from p1:
		/peer 1 addr ${p2.node.ip} 29665/
		/peer 1 id Device2/
	expect from p2:
		/peer 1 addr ${p1.node.ip} 29665/
		/peer 1 id Device1/

	for i in [0..10]:
		with p1:
			# Create blob with (i * 1000) bytes
			send "store blob"
			for j in [1 .. i * 10]:
				# 100 bytes each line
				send "123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789"
			send ""
			expect /store-done (blake2#[0-9a-f]*)/ capture ref

			send "test-message-send 1 $ref"
			expect /test-message-send done/
			expect /test-message-received blob ${i*1000} $ref/ from p2


test ManyStreams:
	spawn as p1
	spawn as p2
	send "create-identity Device1" to p1
	send "create-identity Device2" to p2
	send "start-server" to p1
	send "start-server" to p2
	expect from p1:
		/peer 1 addr ${p2.node.ip} 29665/
		/peer 1 id Device2/
	expect from p2:
		/peer 1 addr ${p1.node.ip} 29665/
		/peer 1 id Device1/

	for i in [0..100]:
		with p1:
			# Create blob with 1000 bytes + decimal i
			send "store blob"
			for j in [1 .. 10]:
				# 100 bytes each line
				send "123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789"
			send "$i"
			send ""
			expect /store-done (blake2#[0-9a-f]*)/ capture ref

			send "test-message-send 1 $ref"
			expect /test-message-send done/
			expect /test-message-received blob 100[2-4] $ref/ from p2


test MultipleServiceRefs:
	spawn as p1
	spawn as p2
	send "create-identity Device1" to p1
	send "create-identity Device2" to p2
	send "start-server" to p1
	send "start-server" to p2
	expect from p1:
		/peer 1 addr ${p2.node.ip} 29665/
		/peer 1 id Device2/
	expect from p2:
		/peer 1 addr ${p1.node.ip} 29665/
		/peer 1 id Device1/

	let kbytes = 2

	with p1:
		send "store blob"
		send "A"
		send ""
		expect /store-done (blake2#[0-9a-f]*)/ capture ref_a

		# Create blobs with (kbytes * 1000) bytes each

		send "store blob"
		send "B"
		for j in [1 .. kbytes * 10]:
			# 100 bytes each line
			send "123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789"
		send ""
		expect /store-done (blake2#[0-9a-f]*)/ capture ref_b

		send "store blob"
		send "C"
		for j in [1 .. kbytes * 10]:
			# 100 bytes each line
			send "123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789"
		send ""
		expect /store-done (blake2#[0-9a-f]*)/ capture ref_c

		send "store blob"
		send "D"
		for j in [1 .. kbytes * 10]:
			# 100 bytes each line
			send "123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789"
		send ""
		expect /store-done (blake2#[0-9a-f]*)/ capture ref_d

		send "test-message-send 1 $ref_a $ref_b $ref_c $ref_d"
		expect /test-message-send done/
		expect /test-message-received blob [0-9]+ $ref_a/ from p2
		expect /test-message-received blob [0-9]+ $ref_b/ from p2
		expect /test-message-received blob [0-9]+ $ref_c/ from p2
		expect /test-message-received blob [0-9]+ $ref_d/ from p2


test Reconnection:
	spawn as p1
	with p1:
		send "create-identity Device1"
		send "start-server"

	node n
	local:
		spawn as p2 on n
		send "create-identity Device2" to p2
		send "start-server" to p2

		expect from p1:
			/peer 1 addr ${p2.node.ip} 29665/
			/peer 1 id Device2/
		expect from p2:
			/peer 1 addr ${p1.node.ip} 29665/
			/peer 1 id Device1/

		with p1:
			send "store blob"
			send "message1"
			send ""
			expect /store-done (blake2#[0-9a-f]*)/ capture message

			send "test-message-send 1 $message"
			expect /test-message-send done/
			expect /test-message-received blob [0-9]+ $message/ from p2

			send "peer-list"
			expect /peer-list-item 1 addr ${p2.node.ip} 29665 id Device2/
			local:
				expect /peer-list-(.*)/ capture done
				guard (done == "done")

	# Restart process on node 'n'
	local:
		spawn as p2 on n
		send "start-server" to p2
		send "peer-add ${p1.node.ip}" to p2

		expect from p2:
			/peer 1 addr ${p1.node.ip} 29665/
			/peer 1 id Device1/

		with p1:
			send "store blob"
			send "message2"
			send ""
			expect /store-done (blake2#[0-9a-f]*)/ capture message

			send "test-message-send 1 $message"
			expect /test-message-send done/
			expect /test-message-received blob [0-9]+ $message/ from p2

		# Drop and re-add peer p2:
		with p1:
			send "peer-list"
			expect /peer-list-item 1 addr ${p2.node.ip} 29665 id Device2/
			local:
				expect /peer-list-(.*)/ capture done
				guard (done == "done")

			send "peer-drop 1"
			send "peer-list"
			local:
				expect /peer-list-(.*)/ capture done
				guard (done == "done")

			send "peer-add ${p2.node.ip}"
			expect /peer 2 addr ${p2.node.ip} 29665/
			expect /peer 2 id Device2/

			send "peer-list"
			expect /peer-list-item 2 addr ${p2.node.ip} 29665 id Device2/
			local:
				expect /peer-list-(.*)/ capture done
				guard (done == "done")

			send "store blob"
			send "message3"
			send ""
			expect /store-done (blake2#[0-9a-f]*)/ capture message

			send "test-message-send 2 $message"
			expect /test-message-send done/
			expect /test-message-received blob [0-9]+ $message/ from p2

		# Drop on both sides and re-add:
		with p2:
			send "peer-list"
			expect /peer-list-item 1 addr ${p1.node.ip} 29665 id Device1/
			local:
				expect /peer-list-(.*)/ capture done
				guard (done == "done")

			send "peer-drop 1"
			send "peer-list"
			local:
				expect /peer-list-(.*)/ capture done
				guard (done == "done")

		with p1:
			send "peer-list"
			expect /peer-list-item 2 addr ${p2.node.ip} 29665 id Device2/
			local:
				expect /peer-list-(.*)/ capture done
				guard (done == "done")

			send "peer-drop 2"
			send "peer-list"
			local:
				expect /peer-list-(.*)/ capture done
				guard (done == "done")

		send "peer-add ${p1.node.ip}" to p2

		with p2:
			expect /peer 2 addr ${p1.node.ip} 29665/ from p2
			expect /peer 2 id Device1/ from p2

			send "peer-list"
			expect /peer-list-item 2 addr ${p1.node.ip} 29665 id Device1/
			local:
				expect /peer-list-(.*)/ capture done
				guard (done == "done")

			send "store blob"
			send "message4"
			send ""
			expect /store-done (blake2#[0-9a-f]*)/ capture message

			send "test-message-send 2 $message"
			expect /test-message-send done/

			with p1:
				expect /peer 3 addr ${p2.node.ip} 29665/
				expect /peer 3 id Device2/

				send "peer-list"
				expect /peer-list-item 3 addr ${p2.node.ip} 29665 id Device2/
				local:
					expect /peer-list-(.*)/ capture done
					guard (done == "done")

				expect /test-message-received blob [0-9]+ $message/


test SendUnknownObjectType:
	let refpat = /blake2#[0-9a-f]*/

	spawn as p1
	spawn as p2

	with p1:
		send "create-identity Device1"
		send "start-server"
	with p2:
		send "create-identity Device2"
		send "start-server"

	expect from p1:
		/peer 1 addr ${p2.node.ip} 29665/
		/peer 1 id Device2/
	expect from p2:
		/peer 1 addr ${p1.node.ip} 29665/
		/peer 1 id Device1/

	with p1:
		send:
			"store test-unknown"
			"TEST"
			""
		expect /store-done ($refpat)/ capture r1

		send "test-message-send 1 $r1"
		expect /test-message-send done/

		with p2:
			expect /test-message-received test-unknown [0-9]+ $r1/

			send "load $r1"
			expect /load-type test-unknown 5/
			expect /load-line TEST/
			local:
				expect /load-(.*)/ capture done
				guard (done == "done")