github.com/ipfans/trojan-go@v0.11.0/redirector/redirector_test.go (about)

     1  package redirector
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net"
     7  	"net/http"
     8  	"strings"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/ipfans/trojan-go/common"
    13  	"github.com/ipfans/trojan-go/test/util"
    14  )
    15  
    16  func TestRedirector(t *testing.T) {
    17  	ctx, cancel := context.WithCancel(context.Background())
    18  	redir := NewRedirector(ctx)
    19  	redir.Redirect(&Redirection{
    20  		Dial:        nil,
    21  		RedirectTo:  nil,
    22  		InboundConn: nil,
    23  	})
    24  	var fakeAddr net.Addr
    25  	var fakeConn net.Conn
    26  	redir.Redirect(&Redirection{
    27  		Dial:        nil,
    28  		RedirectTo:  fakeAddr,
    29  		InboundConn: fakeConn,
    30  	})
    31  	redir.Redirect(&Redirection{
    32  		Dial:        nil,
    33  		RedirectTo:  nil,
    34  		InboundConn: fakeConn,
    35  	})
    36  	redir.Redirect(&Redirection{
    37  		Dial:        nil,
    38  		RedirectTo:  fakeAddr,
    39  		InboundConn: nil,
    40  	})
    41  	l, err := net.Listen("tcp", "127.0.0.1:0")
    42  	common.Must(err)
    43  	conn1, err := net.Dial("tcp", l.Addr().String())
    44  	common.Must(err)
    45  	conn2, err := l.Accept()
    46  	common.Must(err)
    47  	redirAddr, err := net.ResolveTCPAddr("tcp", util.HTTPAddr)
    48  	common.Must(err)
    49  	redir.Redirect(&Redirection{
    50  		Dial:        nil,
    51  		RedirectTo:  redirAddr,
    52  		InboundConn: conn2,
    53  	})
    54  	time.Sleep(time.Second)
    55  	req, err := http.NewRequest("GET", "http://localhost/", nil)
    56  	common.Must(err)
    57  	req.Write(conn1)
    58  	buf := make([]byte, 1024)
    59  	conn1.Read(buf)
    60  	fmt.Println(string(buf))
    61  	if !strings.HasPrefix(string(buf), "HTTP/1.1 200 OK") {
    62  		t.Fail()
    63  	}
    64  	cancel()
    65  	conn1.Close()
    66  	conn2.Close()
    67  }