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 }