github.com/database64128/shadowsocks-go@v1.7.0/direct/stream_test.go (about) 1 package direct 2 3 import ( 4 "bytes" 5 "crypto/rand" 6 "net/netip" 7 "testing" 8 9 "github.com/database64128/shadowsocks-go/conn" 10 "github.com/database64128/shadowsocks-go/pipe" 11 "github.com/database64128/shadowsocks-go/zerocopy" 12 ) 13 14 func TestDirectStreamReadWriter(t *testing.T) { 15 pl, pr := pipe.NewDuplexPipe() 16 17 l := DirectStreamReadWriter{ 18 rw: pl, 19 } 20 r := DirectStreamReadWriter{ 21 rw: pr, 22 } 23 24 zerocopy.ReadWriterTestFunc(t, &l, &r) 25 } 26 27 func testShadowsocksNoneStreamReadWriter(t *testing.T, clientInitialPayload []byte) { 28 pl, pr := pipe.NewDuplexPipe() 29 plo := zerocopy.SimpleDirectReadWriteCloserOpener{DirectReadWriteCloser: pl} 30 31 clientTargetAddr := conn.AddrFromIPPort(netip.AddrPortFrom(netip.IPv6Unspecified(), 53)) 32 serverInitialPayload := make([]byte, len(clientInitialPayload)) 33 34 var ( 35 c *DirectStreamReadWriter 36 s *DirectStreamReadWriter 37 serverTargetAddr conn.Addr 38 nr int 39 cerr, serr error 40 ) 41 42 ctrlCh := make(chan struct{}) 43 44 go func() { 45 c, _, cerr = NewShadowsocksNoneStreamClientReadWriter(&plo, clientTargetAddr, clientInitialPayload) 46 ctrlCh <- struct{}{} 47 }() 48 49 go func() { 50 s, serverTargetAddr, serr = NewShadowsocksNoneStreamServerReadWriter(pr) 51 if len(serverInitialPayload) > 0 && serr == nil { 52 nr, serr = s.ReadZeroCopy(serverInitialPayload, 0, len(serverInitialPayload)) 53 } 54 ctrlCh <- struct{}{} 55 }() 56 57 <-ctrlCh 58 <-ctrlCh 59 if cerr != nil { 60 t.Fatal(cerr) 61 } 62 if serr != nil { 63 t.Fatal(serr) 64 } 65 66 if nr != len(serverInitialPayload) { 67 t.Fatalf("Expected server initial payload bytes %d, got %d", len(serverInitialPayload), nr) 68 } 69 if !clientTargetAddr.Equals(serverTargetAddr) { 70 t.Errorf("Target address mismatch: c: %s, s: %s", clientTargetAddr, serverTargetAddr) 71 } 72 if !bytes.Equal(clientInitialPayload, serverInitialPayload) { 73 t.Error("Initial payload mismatch") 74 } 75 76 zerocopy.ReadWriterTestFunc(t, c, s) 77 } 78 79 func TestShadowsocksNoneStreamReadWriter(t *testing.T) { 80 initialPayload := make([]byte, 1024) 81 _, err := rand.Read(initialPayload) 82 if err != nil { 83 t.Fatal(err) 84 } 85 86 testShadowsocksNoneStreamReadWriter(t, nil) 87 testShadowsocksNoneStreamReadWriter(t, initialPayload) 88 } 89 90 func TestSocks5StreamReadWriter(t *testing.T) { 91 pl, pr := pipe.NewDuplexPipe() 92 93 clientTargetAddr := conn.AddrFromIPPort(netip.AddrPortFrom(netip.IPv6Unspecified(), 53)) 94 95 var ( 96 c *DirectStreamReadWriter 97 s *DirectStreamReadWriter 98 serverTargetAddr conn.Addr 99 cerr, serr error 100 ) 101 102 ctrlCh := make(chan struct{}) 103 104 go func() { 105 c, cerr = NewSocks5StreamClientReadWriter(pl, clientTargetAddr) 106 ctrlCh <- struct{}{} 107 }() 108 109 go func() { 110 s, serverTargetAddr, serr = NewSocks5StreamServerReadWriter(pr, true, false) 111 ctrlCh <- struct{}{} 112 }() 113 114 <-ctrlCh 115 <-ctrlCh 116 if cerr != nil { 117 t.Fatal(cerr) 118 } 119 if serr != nil { 120 t.Fatal(serr) 121 } 122 123 if !clientTargetAddr.Equals(serverTargetAddr) { 124 t.Errorf("Target address mismatch: c: %s, s: %s", clientTargetAddr, serverTargetAddr) 125 } 126 127 zerocopy.ReadWriterTestFunc(t, c, s) 128 }