@cryptotaxi247 / kubo / commits / 35c22781f

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 +}