github.com/MerlinKodo/sing-shadowsocks@v0.2.6/shadowaead_2022/service_multi_test.go (about)

     1  package shadowaead_2022_test
     2  
     3  import (
     4  	"context"
     5  	"crypto/rand"
     6  	"net"
     7  	"sync"
     8  	"testing"
     9  
    10  	"github.com/MerlinKodo/sing-shadowsocks/shadowaead_2022"
    11  	"github.com/sagernet/sing/common"
    12  	E "github.com/sagernet/sing/common/exceptions"
    13  	M "github.com/sagernet/sing/common/metadata"
    14  	N "github.com/sagernet/sing/common/network"
    15  )
    16  
    17  func TestMultiService(t *testing.T) {
    18  	t.Parallel()
    19  	method := "2022-blake3-aes-128-gcm"
    20  	var iPSK [16]byte
    21  	rand.Reader.Read(iPSK[:])
    22  
    23  	var wg sync.WaitGroup
    24  
    25  	multiService, err := shadowaead_2022.NewMultiService[string](method, iPSK[:], 500, &multiHandler{t, &wg}, nil)
    26  	if err != nil {
    27  		t.Fatal(err)
    28  	}
    29  
    30  	var uPSK [16]byte
    31  	rand.Reader.Read(uPSK[:])
    32  	multiService.UpdateUsers([]string{"my user"}, [][]byte{uPSK[:]})
    33  
    34  	client, err := shadowaead_2022.New(method, [][]byte{iPSK[:], uPSK[:]}, nil)
    35  	if err != nil {
    36  		t.Fatal(err)
    37  	}
    38  	wg.Add(1)
    39  
    40  	serverConn, clientConn := net.Pipe()
    41  	defer common.Close(serverConn, clientConn)
    42  	go func() {
    43  		err := multiService.NewConnection(context.Background(), serverConn, M.Metadata{})
    44  		if err != nil {
    45  			serverConn.Close()
    46  			t.Error(E.Cause(err, "server"))
    47  			return
    48  		}
    49  	}()
    50  	_, err = client.DialConn(clientConn, M.ParseSocksaddr("test.com:443"))
    51  	if err != nil {
    52  		t.Fatal(err)
    53  	}
    54  	wg.Wait()
    55  }
    56  
    57  type multiHandler struct {
    58  	t  *testing.T
    59  	wg *sync.WaitGroup
    60  }
    61  
    62  func (h *multiHandler) NewConnection(ctx context.Context, conn net.Conn, metadata M.Metadata) error {
    63  	if metadata.Destination.String() != "test.com:443" {
    64  		h.t.Error("bad destination")
    65  	}
    66  	h.wg.Done()
    67  	return nil
    68  }
    69  
    70  func (h *multiHandler) NewPacketConnection(ctx context.Context, conn N.PacketConn, metadata M.Metadata) error {
    71  	return nil
    72  }
    73  
    74  func (h *multiHandler) NewError(ctx context.Context, err error) {
    75  	h.t.Error(ctx, err)
    76  }