github.com/ipfans/trojan-go@v0.11.0/tunnel/shadowsocks/shadowsocks_test.go (about)

     1  package shadowsocks
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net"
     7  	"strconv"
     8  	"strings"
     9  	"sync"
    10  	"testing"
    11  
    12  	"github.com/ipfans/trojan-go/common"
    13  	"github.com/ipfans/trojan-go/config"
    14  	"github.com/ipfans/trojan-go/test/util"
    15  	"github.com/ipfans/trojan-go/tunnel/freedom"
    16  	"github.com/ipfans/trojan-go/tunnel/transport"
    17  )
    18  
    19  func TestShadowsocks(t *testing.T) {
    20  	p, err := strconv.ParseInt(util.HTTPPort, 10, 32)
    21  	common.Must(err)
    22  
    23  	port := common.PickPort("tcp", "127.0.0.1")
    24  	transportConfig := &transport.Config{
    25  		LocalHost:  "127.0.0.1",
    26  		LocalPort:  port,
    27  		RemoteHost: "127.0.0.1",
    28  		RemotePort: port,
    29  	}
    30  	ctx := config.WithConfig(context.Background(), transport.Name, transportConfig)
    31  	ctx = config.WithConfig(ctx, freedom.Name, &freedom.Config{})
    32  	tcpClient, err := transport.NewClient(ctx, nil)
    33  	common.Must(err)
    34  	tcpServer, err := transport.NewServer(ctx, nil)
    35  	common.Must(err)
    36  
    37  	cfg := &Config{
    38  		RemoteHost: "127.0.0.1",
    39  		RemotePort: int(p),
    40  		Shadowsocks: ShadowsocksConfig{
    41  			Enabled:  true,
    42  			Method:   "AES-128-GCM",
    43  			Password: "password",
    44  		},
    45  	}
    46  	ctx = config.WithConfig(ctx, Name, cfg)
    47  
    48  	c, err := NewClient(ctx, tcpClient)
    49  	common.Must(err)
    50  	s, err := NewServer(ctx, tcpServer)
    51  	common.Must(err)
    52  
    53  	wg := sync.WaitGroup{}
    54  	wg.Add(2)
    55  	var conn1, conn2 net.Conn
    56  	go func() {
    57  		var err error
    58  		conn1, err = c.DialConn(nil, nil)
    59  		common.Must(err)
    60  		conn1.Write(util.GeneratePayload(1024))
    61  		wg.Done()
    62  	}()
    63  	go func() {
    64  		var err error
    65  		conn2, err = s.AcceptConn(nil)
    66  		common.Must(err)
    67  		buf := [1024]byte{}
    68  		conn2.Read(buf[:])
    69  		wg.Done()
    70  	}()
    71  	wg.Wait()
    72  	if !util.CheckConn(conn1, conn2) {
    73  		t.Fail()
    74  	}
    75  
    76  	go func() {
    77  		var err error
    78  		conn2, err = s.AcceptConn(nil)
    79  		if err == nil {
    80  			t.Fail()
    81  		}
    82  	}()
    83  
    84  	// test redirection
    85  	conn3, err := tcpClient.DialConn(nil, nil)
    86  	common.Must(err)
    87  	n, err := conn3.Write(util.GeneratePayload(1024))
    88  	common.Must(err)
    89  	fmt.Println("write:", n)
    90  	buf := [1024]byte{}
    91  	n, err = conn3.Read(buf[:])
    92  	common.Must(err)
    93  	fmt.Println("read:", n)
    94  	if !strings.Contains(string(buf[:n]), "Bad Request") {
    95  		t.Fail()
    96  	}
    97  	conn1.Close()
    98  	conn3.Close()
    99  	c.Close()
   100  	s.Close()
   101  }