summaryrefslogtreecommitdiff
path: root/test/message.test
blob: 2990d0fa5dee75c627892a619be07068fb824522 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
module message

import common

test DirectMessage:
	let services = "contact,dm"

	spawn as p1
	spawn as p2
	send "create-identity Device1 Owner1" to p1
	send "create-identity Device2 Owner2" to p2
	send "start-server services $services" to p1
	send "start-server services $services" to p2

	expect from p1:
		/peer ([0-9]+) addr ${p2.node.ip} 29665/ capture peer1_2
		/peer $peer1_2 id Device2 Owner2/

	expect from p2:
		/peer ([0-9]+) addr ${p1.node.ip} 29665/ capture peer2_1
		/peer $peer2_1 id Device1 Owner1/

	with p1:
		send "dm-list-peer $peer1_2"
		expect /dm-list-done/

	# Send messages to peers

	for i in [1..2]:
		send "dm-send-peer $peer1_2 hello$i" to p1
		expect /dm-received from Owner1 text hello$i/ from p2

	for i in [1..2]:
		send "dm-send-peer $peer2_1 hi$i" to p2
		expect /dm-received from Owner2 text hi$i/ from p1

	for i in [3..4]:
		send "dm-send-peer $peer1_2 hello$i" to p1
		expect /dm-received from Owner1 text hello$i/ from p2
		send "dm-send-peer $peer2_1 hi$i" to p2
		expect /dm-received from Owner2 text hi$i/ from p1

	# Create contacts

	local:
		send "contact-request $peer1_2" to p1
		expect /contact-request $peer2_1 ([0-9]*)/ from p2 capture code2
		expect /contact-response $peer1_2 ([0-9]*)/ from p1 capture code1
		guard (code1 == code2)

	send "contact-accept $peer1_2" to p1
	send "contact-accept $peer2_1" to p2
	expect /contact-request-done $peer2_1/ from p2
	expect /contact-response-done $peer1_2/ from p1

	send "contact-list" to p1
	expect from p1:
		/contact-list-item ([a-z0-9#]+) Owner2 Owner2/ capture c1_2
		/contact-list-(.*)/ capture done1_1

	send "contact-list" to p2
	expect from p2:
		/contact-list-item ([a-z0-9#]+) Owner1 Owner1/ capture c2_1
		/contact-list-(.*)/ capture done1_2

	# Send messages to contacts

	for i in [1..2]:
		send "dm-send-contact $c1_2 hello_c_$i" to p1
		expect /dm-received from Owner1 text hello_c_$i/ from p2

	for i in [1..2]:
		send "dm-send-contact $c2_1 hi_c_$i" to p2
		expect /dm-received from Owner2 text hi_c_$i/ from p1

	for i in [3..4]:
		send "dm-send-contact $c1_2 hello_c_$i" to p1
		expect /dm-received from Owner1 text hello_c_$i/ from p2
		send "dm-send-contact $c2_1 hi_c_$i" to p2
		expect /dm-received from Owner2 text hi_c_$i/ from p1

	send "dm-list-contact $c1_2" to p1
	send "dm-list-contact $c2_1" to p2
	for p in [p1, p2]:
		with p:
			for i in [1..4]:
				expect /dm-list-item from Owner1 text hello_c_$i/
				expect /dm-list-item from Owner2 text hi_c_$i/
			for i in [1..4]:
				expect /dm-list-item from Owner1 text hello$i/
				expect /dm-list-item from Owner2 text hi$i/
			expect /dm-list-(.*)/ capture done
			guard (done == "done")

	# Reload message history

	for p in [p1, p2]:
		with p:
			send "stop-server"
	for p in [p1, p2]:
		with p:
			expect /stop-server-done/
	for p in [p1, p2]:
		with p:
			send "start-server services $services"

	with p1:
		send "contact-list"
		expect:
			/contact-list-item $c1_2 Owner2 Owner2/
			/contact-list-(.*)/ capture done
		guard (done == "done")

	send "dm-list-contact $c1_2" to p1
	send "dm-list-contact $c2_1" to p2
	for p in [p1, p2]:
		with p:
			for i in [1..4]:
				expect /dm-list-item from Owner1 text hello_c_$i/
				expect /dm-list-item from Owner2 text hi_c_$i/
			for i in [1..4]:
				expect /dm-list-item from Owner1 text hello$i/
				expect /dm-list-item from Owner2 text hi$i/
			expect /dm-list-(.*)/ capture done
			guard (done == "done")

	# Send message while offline

	for p in [p1, p2]:
		with p:
			send "stop-server"
	for p in [p1, p2]:
		with p:
			expect /stop-server-done/
	send "start-server services $services" to p2

	send "dm-send-contact $c1_2 while_offline" to p1
	send "start-server services $services" to p1

	expect /dm-received from Owner1 text while_offline/ from p2

	for p in [p1, p2]:
		with p:
			send "stop-server"
	for p in [p1, p2]:
		with p:
			expect /stop-server-done/
	send "start-server services $services" to p1

	send "dm-send-contact $c1_2 while_peer_offline" to p1
	# TODO: sync from p1 on peer p2 discovery not ensured without addition wait
	#wait
	send "start-server services $services" to p2

	expect /dm-received from Owner1 text while_peer_offline/ from p2


test DirectMessageDiscovery:
	let services = "dm,discovery"

	subnet sd
	subnet s1
	subnet s2
	subnet s3
	subnet s4

	spawn on sd as pd
	spawn on s1 as p1
	spawn on s2 as p2
	spawn on s3 as p3
	spawn on s4 as p4

	send "create-identity Discovery" to pd

	send "create-identity Device1 Owner1" to p1
	expect /create-identity-done ref ($refpat)/ from p1 capture p1_id
	send "identity-info $p1_id" to p1
	expect /identity-info ref $p1_id base ($refpat) owner ($refpat).*/ from p1 capture p1_base, p1_owner

	send "create-identity Device2 Owner2" to p2
	expect /create-identity-done ref ($refpat)/ from p2 capture p2_id
	send "identity-info $p2_id" to p2
	expect /identity-info ref $p2_id base ($refpat) owner ($refpat).*/ from p2 capture p2_base, p2_owner
	send "identity-info $p2_owner" to p2
	expect /identity-info ref $p2_owner base ($refpat).*/ from p2 capture p2_obase

	send "create-identity Device3 Owner3" to p3
	expect /create-identity-done ref ($refpat)/ from p3 capture p3_id
	send "identity-info $p3_id" to p3
	expect /identity-info ref $p3_id base ($refpat) owner ($refpat).*/ from p3 capture p3_base, p3_owner

	send "create-identity Device4 Owner4" to p4
	expect /create-identity-done ref ($refpat)/ from p4 capture p4_id
	send "identity-info $p4_id" to p4
	expect /identity-info ref $p4_id base ($refpat) owner ($refpat).*/ from p4 capture p4_base, p4_owner


	for p in [ p1, p2, p3, p4 ]:
		with p:
			send "start-server services $services"

	for p in [ p2, p3, p4 ]:
		with p1:
			send "peer-add ${p.node.ip}"
			expect:
				/peer [0-9]+ addr ${p.node.ip} 29665/
				/peer [0-9]+ id Device. Owner./
		expect from p:
			/peer 1 addr ${p1.node.ip} 29665/
			/peer 1 id Device1 Owner1/

	# Make sure p1 has other identities in storage:
	for i in [ 1 .. 3 ]:
		send "dm-send-peer $i init1" to p1
	for p in [ p2, p3, p4 ]:
		expect /dm-received from Owner1 text init1/ from p
		send "dm-send-identity $p1_owner init2" to p
		expect /dm-received from Owner. text init2/ from p1

	# Restart servers to remove peers:
	for p in [ p1, p2, p3, p4 ]:
		with p:
			send "stop-server"
	for p in [ p1, p2, p3, p4 ]:
		with p:
			expect /stop-server-done/

	# Prepare message before peers connect to discovery
	send "dm-send-identity $p4_owner hello_to_p4" to p1

	for p in [ p1, p2, p3, p4, pd ]:
		with p:
			send "start-server services $services"

	for p in [ p2, p3, p4, 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 [0-9]+ addr ${p.node.ip} 29665/
			/peer [0-9]+ id Device. Owner./

	multiply_timeout by 2.0

	# Connect via discovery manually, then send message
	send "discovery-connect $p2_obase" to p1
	expect from p1:
		/peer [0-9]+ addr ${p2.node.ip} 29665/
		/peer [0-9]+ id Device2 Owner2/
	send "dm-send-identity $p2_owner hello_to_p2" to p1
	expect /dm-received from Owner1 text hello_to_p2/ from p2

	# Send message, expect automatic discovery
	send "dm-send-identity $p3_owner hello_to_p3" to p1
	expect /dm-received from Owner1 text hello_to_p3/ from p3

	# Verify the first message
	expect /dm-received from Owner1 text hello_to_p4/ from p4

	for p in [ p1, p2, p3, p4, pd ]:
		send "stop-server" to p
	for p in [ p1, p2, p3, p4, pd ]:
		expect /stop-server-done/ from p