gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/tunnel/tunnel_test.go (about) 1 package tunnel 2 3 import ( 4 "sync" 5 "testing" 6 "time" 7 8 "gitee.com/liuxuezhan/go-micro-v1.18.0/transport" 9 ) 10 11 func testBrokenTunAccept(t *testing.T, tun Tunnel, wait chan bool, wg *sync.WaitGroup) { 12 defer wg.Done() 13 14 // listen on some virtual address 15 tl, err := tun.Listen("test-tunnel") 16 if err != nil { 17 t.Fatal(err) 18 } 19 20 // receiver ready; notify sender 21 wait <- true 22 23 // accept a connection 24 c, err := tl.Accept() 25 if err != nil { 26 t.Fatal(err) 27 } 28 29 // accept the message and close the tunnel 30 // we do this to simulate loss of network connection 31 m := new(transport.Message) 32 if err := c.Recv(m); err != nil { 33 t.Fatal(err) 34 } 35 36 // close all the links 37 for _, link := range tun.Links() { 38 link.Close() 39 } 40 41 // receiver ready; notify sender 42 wait <- true 43 44 // accept the message 45 m = new(transport.Message) 46 if err := c.Recv(m); err != nil { 47 t.Fatal(err) 48 } 49 50 // notify the sender we have received 51 wait <- true 52 } 53 54 func testBrokenTunSend(t *testing.T, tun Tunnel, wait chan bool, wg *sync.WaitGroup, reconnect time.Duration) { 55 defer wg.Done() 56 57 // wait for the listener to get ready 58 <-wait 59 60 // dial a new session 61 c, err := tun.Dial("test-tunnel") 62 if err != nil { 63 t.Fatal(err) 64 } 65 defer c.Close() 66 67 m := transport.Message{ 68 Header: map[string]string{ 69 "test": "send", 70 }, 71 } 72 73 // send the message 74 if err := c.Send(&m); err != nil { 75 t.Fatal(err) 76 } 77 78 // wait for the listener to get ready 79 <-wait 80 81 // give it time to reconnect 82 time.Sleep(reconnect) 83 84 // send the message 85 if err := c.Send(&m); err != nil { 86 t.Fatal(err) 87 } 88 89 // wait for the listener to receive the message 90 // c.Send merely enqueues the message to the link send queue and returns 91 // in order to verify it was received we wait for the listener to tell us 92 <-wait 93 } 94 95 // testAccept will accept connections on the transport, create a new link and tunnel on top 96 func testAccept(t *testing.T, tun Tunnel, wait chan bool, wg *sync.WaitGroup) { 97 defer wg.Done() 98 99 // listen on some virtual address 100 tl, err := tun.Listen("test-tunnel") 101 if err != nil { 102 t.Fatal(err) 103 } 104 105 // receiver ready; notify sender 106 wait <- true 107 108 // accept a connection 109 c, err := tl.Accept() 110 if err != nil { 111 t.Fatal(err) 112 } 113 114 // get a message 115 for { 116 // accept the message 117 m := new(transport.Message) 118 if err := c.Recv(m); err != nil { 119 t.Fatal(err) 120 } 121 122 if v := m.Header["test"]; v != "send" { 123 t.Fatalf("Accept side expected test:send header. Received: %s", v) 124 } 125 126 // now respond 127 m.Header["test"] = "accept" 128 if err := c.Send(m); err != nil { 129 t.Fatal(err) 130 } 131 132 wait <- true 133 134 return 135 } 136 } 137 138 // testSend will create a new link to an address and then a tunnel on top 139 func testSend(t *testing.T, tun Tunnel, wait chan bool, wg *sync.WaitGroup) { 140 defer wg.Done() 141 142 // wait for the listener to get ready 143 <-wait 144 145 // dial a new session 146 c, err := tun.Dial("test-tunnel") 147 if err != nil { 148 t.Fatal(err) 149 } 150 defer c.Close() 151 152 m := transport.Message{ 153 Header: map[string]string{ 154 "test": "send", 155 }, 156 } 157 158 // send the message 159 if err := c.Send(&m); err != nil { 160 t.Fatal(err) 161 } 162 163 // now wait for the response 164 mr := new(transport.Message) 165 if err := c.Recv(mr); err != nil { 166 t.Fatal(err) 167 } 168 169 <-wait 170 171 if v := mr.Header["test"]; v != "accept" { 172 t.Fatalf("Message not received from accepted side. Received: %s", v) 173 } 174 } 175 176 func TestTunnel(t *testing.T) { 177 // create a new tunnel client 178 tunA := NewTunnel( 179 Address("127.0.0.1:9096"), 180 Nodes("127.0.0.1:9097"), 181 ) 182 183 // create a new tunnel server 184 tunB := NewTunnel( 185 Address("127.0.0.1:9097"), 186 ) 187 188 // start tunB 189 err := tunB.Connect() 190 if err != nil { 191 t.Fatal(err) 192 } 193 defer tunB.Close() 194 195 // start tunA 196 err = tunA.Connect() 197 if err != nil { 198 t.Fatal(err) 199 } 200 defer tunA.Close() 201 202 wait := make(chan bool) 203 204 var wg sync.WaitGroup 205 206 wg.Add(1) 207 // start the listener 208 go testAccept(t, tunB, wait, &wg) 209 210 wg.Add(1) 211 // start the client 212 go testSend(t, tunA, wait, &wg) 213 214 // wait until done 215 wg.Wait() 216 } 217 218 func TestLoopbackTunnel(t *testing.T) { 219 // create a new tunnel 220 tun := NewTunnel( 221 Address("127.0.0.1:9096"), 222 Nodes("127.0.0.1:9096"), 223 ) 224 225 // start tunnel 226 err := tun.Connect() 227 if err != nil { 228 t.Fatal(err) 229 } 230 defer tun.Close() 231 232 time.Sleep(500 * time.Millisecond) 233 234 wait := make(chan bool) 235 236 var wg sync.WaitGroup 237 238 wg.Add(1) 239 // start the listener 240 go testAccept(t, tun, wait, &wg) 241 242 wg.Add(1) 243 // start the client 244 go testSend(t, tun, wait, &wg) 245 246 // wait until done 247 wg.Wait() 248 } 249 250 func TestTunnelRTTRate(t *testing.T) { 251 // create a new tunnel client 252 tunA := NewTunnel( 253 Address("127.0.0.1:9096"), 254 Nodes("127.0.0.1:9097"), 255 ) 256 257 // create a new tunnel server 258 tunB := NewTunnel( 259 Address("127.0.0.1:9097"), 260 ) 261 262 // start tunB 263 err := tunB.Connect() 264 if err != nil { 265 t.Fatal(err) 266 } 267 defer tunB.Close() 268 269 // start tunA 270 err = tunA.Connect() 271 if err != nil { 272 t.Fatal(err) 273 } 274 defer tunA.Close() 275 276 wait := make(chan bool) 277 278 var wg sync.WaitGroup 279 280 wg.Add(1) 281 // start the listener 282 go testAccept(t, tunB, wait, &wg) 283 284 wg.Add(1) 285 // start the client 286 go testSend(t, tunA, wait, &wg) 287 288 // wait until done 289 wg.Wait() 290 291 for _, link := range tunA.Links() { 292 t.Logf("Link %s length %v rate %v", link.Id(), link.Length(), link.Rate()) 293 } 294 295 for _, link := range tunB.Links() { 296 t.Logf("Link %s length %v rate %v", link.Id(), link.Length(), link.Rate()) 297 } 298 } 299 300 func TestReconnectTunnel(t *testing.T) { 301 // we manually override the tunnel.ReconnectTime value here 302 // this is so that we make the reconnects faster than the default 5s 303 ReconnectTime = 200 * time.Millisecond 304 305 // create a new tunnel client 306 tunA := NewTunnel( 307 Address("127.0.0.1:9098"), 308 Nodes("127.0.0.1:9099"), 309 ) 310 311 // create a new tunnel server 312 tunB := NewTunnel( 313 Address("127.0.0.1:9099"), 314 ) 315 316 // start tunnel 317 err := tunB.Connect() 318 if err != nil { 319 t.Fatal(err) 320 } 321 defer tunB.Close() 322 323 // start tunnel 324 err = tunA.Connect() 325 if err != nil { 326 t.Fatal(err) 327 } 328 defer tunA.Close() 329 330 wait := make(chan bool) 331 332 var wg sync.WaitGroup 333 334 wg.Add(1) 335 // start tunnel listener 336 go testBrokenTunAccept(t, tunB, wait, &wg) 337 338 wg.Add(1) 339 // start tunnel sender 340 go testBrokenTunSend(t, tunA, wait, &wg, ReconnectTime*5) 341 342 // wait until done 343 wg.Wait() 344 }