relay: test across 4 + stress
Juan Batiz-Benet committed
Dec 28, 2014 at 16:38 UTC
35c22781ff3e7a719075fdde9c5bd4ed7dc17d08
1 file changed
+208
net/services/relay/relay_test.go
+208
@@ -99,3 +99,211 @@ func TestRelaySimple(t *testing.T) {
99
log.Debug("sweet, relay works.")
100
s.Close()
101
}
102
+
103
+func TestRelayAcrossFour(t *testing.T) {
104
+
105
+ ctx := context.Background()
106
+
107
+ // these networks have the relay service wired in already.
108
+ n1 := netutil.GenNetwork(t, ctx)
109
+ n2 := netutil.GenNetwork(t, ctx)
110
+ n3 := netutil.GenNetwork(t, ctx)
111
+ n4 := netutil.GenNetwork(t, ctx)
112
+ n5 := netutil.GenNetwork(t, ctx)
113
+
114
+ n1p := n1.LocalPeer()
115
+ n2p := n2.LocalPeer()
116
+ n3p := n3.LocalPeer()
117
+ n4p := n4.LocalPeer()
118
+ n5p := n5.LocalPeer()
119
+
120
+ netutil.DivulgeAddresses(n2, n1)
121
+ netutil.DivulgeAddresses(n2, n3)
122
+ netutil.DivulgeAddresses(n4, n3)
123
+ netutil.DivulgeAddresses(n4, n5)
124
+
125
+ if err := n1.DialPeer(ctx, n2p); err != nil {
126
+ t.Fatalf("Failed to dial:", err)
127
+ }
128
+ if err := n3.DialPeer(ctx, n2p); err != nil {
129
+ t.Fatalf("Failed to dial:", err)
130
+ }
131
+ if err := n3.DialPeer(ctx, n4p); err != nil {
132
+ t.Fatalf("Failed to dial:", err)
133
+ }
134
+ if err := n5.DialPeer(ctx, n4p); err != nil {
135
+ t.Fatalf("Failed to dial:", err)
136
+ }
137
+
138
+ // setup handler on n5 to copy everything over to the pipe.
139
+ piper, pipew := io.Pipe()
140
+ n5.SetHandler(inet.ProtocolTesting, func(s inet.Stream) {
141
+ log.Debug("relay stream opened to n5!")
142
+ log.Debug("piping and echoing everything")
143
+ w := io.MultiWriter(s, pipew)
144
+ io.Copy(w, s)
145
+ log.Debug("closing stream")
146
+ s.Close()
147
+ })
148
+
149
+ // ok, now we can try to relay n1--->n2--->n3--->n4--->n5
150
+ log.Debug("open relay stream")
151
+ s, err := n1.NewStream(relay.ProtocolRelay, n2p)
152
+ if err != nil {
153
+ t.Fatal(err)
154
+ }
155
+
156
+ log.Debugf("write relay header n1->n3 (%s -> %s)", n1p, n3p)
157
+ if err := relay.WriteHeader(s, n1p, n3p); err != nil {
158
+ t.Fatal(err)
159
+ }
160
+
161
+ log.Debugf("write relay header n1->n4 (%s -> %s)", n1p, n4p)
162
+ if err := mux.WriteProtocolHeader(relay.ProtocolRelay, s); err != nil {
163
+ t.Fatal(err)
164
+ }
165
+ if err := relay.WriteHeader(s, n1p, n4p); err != nil {
166
+ t.Fatal(err)
167
+ }
168
+
169
+ log.Debugf("write relay header n1->n5 (%s -> %s)", n1p, n5p)
170
+ if err := mux.WriteProtocolHeader(relay.ProtocolRelay, s); err != nil {
171
+ t.Fatal(err)
172
+ }
173
+ if err := relay.WriteHeader(s, n1p, n5p); err != nil {
174
+ t.Fatal(err)
175
+ }
176
+
177
+ // ok now the header's there, we can write the next protocol header.
178
+ log.Debug("write testing header")
179
+ if err := mux.WriteProtocolHeader(inet.ProtocolTesting, s); err != nil {
180
+ t.Fatal(err)
181
+ }
182
+
183
+ // okay, now we should be able to write text, and read it out.
184
+ buf1 := []byte("abcdefghij")
185
+ buf2 := make([]byte, 10)
186
+ buf3 := make([]byte, 10)
187
+ log.Debug("write in some text.")
188
+ if _, err := s.Write(buf1); err != nil {
189
+ t.Fatal(err)
190
+ }
191
+
192
+ // read it out from the pipe.
193
+ log.Debug("read it out from the pipe.")
194
+ if _, err := io.ReadFull(piper, buf2); err != nil {
195
+ t.Fatal(err)
196
+ }
197
+ if string(buf1) != string(buf2) {
198
+ t.Fatal("should've gotten that text out of the pipe")
199
+ }
200
+
201
+ // read it out from the stream (echoed)
202
+ log.Debug("read it out from the stream (echoed).")
203
+ if _, err := io.ReadFull(s, buf3); err != nil {
204
+ t.Fatal(err)
205
+ }
206
+ if string(buf1) != string(buf3) {
207
+ t.Fatal("should've gotten that text out of the stream")
208
+ }
209
+
210
+ // sweet. relay works.
211
+ log.Debug("sweet, relaying across 4 works.")
212
+ s.Close()
213
+}
214
+
215
+func TestRelayStress(t *testing.T) {
216
+ buflen := 1 << 18
217
+ iterations := 10
218
+
219
+ ctx := context.Background()
220
+
221
+ // these networks have the relay service wired in already.
222
+ n1 := netutil.GenNetwork(t, ctx)
223
+ n2 := netutil.GenNetwork(t, ctx)
224
+ n3 := netutil.GenNetwork(t, ctx)
225
+
226
+ n1p := n1.LocalPeer()
227
+ n2p := n2.LocalPeer()
228
+ n3p := n3.LocalPeer()
229
+
230
+ netutil.DivulgeAddresses(n2, n1)
231
+ netutil.DivulgeAddresses(n2, n3)
232
+
233
+ if err := n1.DialPeer(ctx, n2p); err != nil {
234
+ t.Fatalf("Failed to dial:", err)
235
+ }
236
+ if err := n3.DialPeer(ctx, n2p); err != nil {
237
+ t.Fatalf("Failed to dial:", err)
238
+ }
239
+
240
+ // setup handler on n3 to copy everything over to the pipe.
241
+ piper, pipew := io.Pipe()
242
+ n3.SetHandler(inet.ProtocolTesting, func(s inet.Stream) {
243
+ log.Debug("relay stream opened to n3!")
244
+ log.Debug("piping and echoing everything")
245
+ w := io.MultiWriter(s, pipew)
246
+ io.Copy(w, s)
247
+ log.Debug("closing stream")
248
+ s.Close()
249
+ })
250
+
251
+ // ok, now we can try to relay n1--->n2--->n3.
252
+ log.Debug("open relay stream")
253
+ s, err := n1.NewStream(relay.ProtocolRelay, n2p)
254
+ if err != nil {
255
+ t.Fatal(err)
256
+ }
257
+
258
+ // ok first thing we write the relay header n1->n3
259
+ log.Debug("write relay header")
260
+ if err := relay.WriteHeader(s, n1p, n3p); err != nil {
261
+ t.Fatal(err)
262
+ }
263
+
264
+ // ok now the header's there, we can write the next protocol header.
265
+ log.Debug("write testing header")
266
+ if err := mux.WriteProtocolHeader(inet.ProtocolTesting, s); err != nil {
267
+ t.Fatal(err)
268
+ }
269
+
270
+ // okay, now write lots of text and read it back out from both
271
+ // the pipe and the stream.
272
+ buf1 := make([]byte, buflen)
273
+ buf2 := make([]byte, len(buf1))
274
+ buf3 := make([]byte, len(buf1))
275
+
276
+ fillbuf := func(buf []byte, b byte) {
277
+ for i := range buf {
278
+ buf[i] = b
279
+ }
280
+ }
281
+
282
+ for i := 0; i < iterations; i++ {
283
+ fillbuf(buf1, byte(int('a')+i))
284
+ log.Debugf("writing %d bytes (%d/%d)", len(buf1), i, iterations)
285
+ if _, err := s.Write(buf1); err != nil {
286
+ t.Fatal(err)
287
+ }
288
+
289
+ log.Debug("read it out from the pipe.")
290
+ if _, err := io.ReadFull(piper, buf2); err != nil {
291
+ t.Fatal(err)
292
+ }
293
+ if string(buf1) != string(buf2) {
294
+ t.Fatal("should've gotten that text out of the pipe")
295
+ }
296
+
297
+ // read it out from the stream (echoed)
298
+ log.Debug("read it out from the stream (echoed).")
299
+ if _, err := io.ReadFull(s, buf3); err != nil {
300
+ t.Fatal(err)
301
+ }
302
+ if string(buf1) != string(buf3) {
303
+ t.Fatal("should've gotten that text out of the stream")
304
+ }
305
+ }
306
+
307
+ log.Debug("sweet, relay works under stress.")
308
+ s.Close()
309
+}