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  }