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  }