github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/proxy/forward_test.go (about)

     1  package proxy
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"net"
     7  	"net/url"
     8  	"testing"
     9  
    10  	"github.com/codingeasygo/util/xio"
    11  )
    12  
    13  func runEchoServer(addr string) {
    14  	ln, err := net.Listen("tcp", addr)
    15  	if err != nil {
    16  		panic(err)
    17  	}
    18  	for {
    19  		conn, err := ln.Accept()
    20  		if err != nil {
    21  			panic(err)
    22  		}
    23  		go io.Copy(conn, conn)
    24  	}
    25  }
    26  
    27  func TestForward(t *testing.T) {
    28  	go runEchoServer("127.0.0.1:13200")
    29  	forward := NewForward("Test")
    30  	{
    31  		listenURL, _ := url.Parse("socks://127.0.0.1:0")
    32  		_, err := forward.StartForward("socks", listenURL, "tcp://${HOST}")
    33  		if err != nil {
    34  			t.Error(err)
    35  			return
    36  		}
    37  		forward.StopForward("socks")
    38  	}
    39  	{
    40  		listenURL, _ := url.Parse("proxy://127.0.0.1:0")
    41  		_, err := forward.StartForward("proxy", listenURL, "tcp://${HOST}")
    42  		if err != nil {
    43  			t.Error(err)
    44  			return
    45  		}
    46  		forward.StopForward("proxy")
    47  	}
    48  	{
    49  		listenURL, _ := url.Parse("tcp://127.0.0.1:13300")
    50  		_, err := forward.StartForward("abc", listenURL, "tcp://127.0.0.1:13200")
    51  		if err != nil {
    52  			t.Error(err)
    53  			return
    54  		}
    55  		conn, err := net.Dial("tcp", "127.0.0.1:13300")
    56  		if err != nil {
    57  			t.Error(err)
    58  			return
    59  		}
    60  		fmt.Fprintf(conn, "abc")
    61  		buf := make([]byte, 1024)
    62  		n, err := conn.Read(buf)
    63  		if err != nil || string(buf[0:n]) != "abc" {
    64  			t.Error(err)
    65  			return
    66  		}
    67  		forward.StopForward("abc")
    68  	}
    69  	{ //stop
    70  		listenURL, _ := url.Parse("proxy://127.0.0.1:0")
    71  		_, err := forward.StartForward("proxy", listenURL, "tcp://${HOST}")
    72  		if err != nil {
    73  			t.Error(err)
    74  			return
    75  		}
    76  		forward.Stop()
    77  	}
    78  	{ //dial fail
    79  		listenURL, _ := url.Parse("tcp://127.0.0.1:13300")
    80  		_, err := forward.StartForward("abc", listenURL, "tcp://127.0.0.1:10")
    81  		if err != nil {
    82  			t.Error(err)
    83  			return
    84  		}
    85  		conn, err := net.Dial("tcp", "127.0.0.1:13300")
    86  		if err != nil {
    87  			t.Error(err)
    88  			return
    89  		}
    90  		buf := make([]byte, 1024)
    91  		_, err = conn.Read(buf)
    92  		if err == nil {
    93  			t.Error(err)
    94  			return
    95  		}
    96  		forward.StopForward("abc")
    97  	}
    98  	{ //error
    99  		listenURL, _ := url.Parse("proxy://127.0.0.1:0")
   100  		l, err := forward.StartForward("proxy", listenURL, "tcp://${HOST}")
   101  		if err != nil {
   102  			t.Error(err)
   103  			return
   104  		}
   105  		_, err = forward.StartForward("proxy", listenURL, "tcp://${HOST}")
   106  		if err == nil {
   107  			t.Error(err)
   108  			return
   109  		}
   110  		forward.Stop()
   111  		forward.procForward(l, "", nil, nil, "")
   112  	}
   113  	{ //dialer
   114  		dialer := RouterPiperDialer{
   115  			Next: xio.PiperDialerF(func(uri string, bufferSize int) (raw xio.Piper, err error) {
   116  				return
   117  			}),
   118  		}
   119  		dialer.DialPiper("", 0)
   120  	}
   121  }