| package integration_tests |
|
|
| import ( |
| "io" |
| "net" |
| "testing" |
|
|
| "github.com/stretchr/testify/assert" |
| "github.com/stretchr/testify/mock" |
|
|
| "github.com/apernet/hysteria/core/v2/client" |
| coreErrs "github.com/apernet/hysteria/core/v2/errors" |
| "github.com/apernet/hysteria/core/v2/internal/integration_tests/mocks" |
| "github.com/apernet/hysteria/core/v2/server" |
| ) |
|
|
| |
|
|
| |
| |
| func TestClientNoServer(t *testing.T) { |
| c, _, err := client.NewClient(&client.Config{ |
| ServerAddr: &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 55666}, |
| }) |
| assert.Nil(t, c) |
| _, ok := err.(coreErrs.ConnectError) |
| assert.True(t, ok) |
| } |
|
|
| |
| |
| |
| func TestClientServerBadAuth(t *testing.T) { |
| |
| udpConn, udpAddr, err := serverConn() |
| assert.NoError(t, err) |
| auth := mocks.NewMockAuthenticator(t) |
| auth.EXPECT().Authenticate(mock.Anything, "badpassword", uint64(0)).Return(false, "").Once() |
| s, err := server.NewServer(&server.Config{ |
| TLSConfig: serverTLSConfig(), |
| Conn: udpConn, |
| Authenticator: auth, |
| }) |
| assert.NoError(t, err) |
| defer s.Close() |
| go s.Serve() |
|
|
| |
| c, _, err := client.NewClient(&client.Config{ |
| ServerAddr: udpAddr, |
| Auth: "badpassword", |
| TLSConfig: client.TLSConfig{InsecureSkipVerify: true}, |
| }) |
| assert.Nil(t, c) |
| _, ok := err.(coreErrs.AuthError) |
| assert.True(t, ok) |
| } |
|
|
| |
| |
| func TestClientServerUDPDisabled(t *testing.T) { |
| |
| udpConn, udpAddr, err := serverConn() |
| assert.NoError(t, err) |
| auth := mocks.NewMockAuthenticator(t) |
| auth.EXPECT().Authenticate(mock.Anything, mock.Anything, mock.Anything).Return(true, "nobody") |
| s, err := server.NewServer(&server.Config{ |
| TLSConfig: serverTLSConfig(), |
| Conn: udpConn, |
| DisableUDP: true, |
| Authenticator: auth, |
| }) |
| assert.NoError(t, err) |
| defer s.Close() |
| go s.Serve() |
|
|
| |
| c, _, err := client.NewClient(&client.Config{ |
| ServerAddr: udpAddr, |
| TLSConfig: client.TLSConfig{InsecureSkipVerify: true}, |
| }) |
| assert.NoError(t, err) |
| defer c.Close() |
|
|
| conn, err := c.UDP() |
| assert.Nil(t, conn) |
| _, ok := err.(coreErrs.DialError) |
| assert.True(t, ok) |
| } |
|
|
| |
| func TestClientServerTCPEcho(t *testing.T) { |
| |
| udpConn, udpAddr, err := serverConn() |
| assert.NoError(t, err) |
| auth := mocks.NewMockAuthenticator(t) |
| auth.EXPECT().Authenticate(mock.Anything, mock.Anything, mock.Anything).Return(true, "nobody") |
| s, err := server.NewServer(&server.Config{ |
| TLSConfig: serverTLSConfig(), |
| Conn: udpConn, |
| Authenticator: auth, |
| }) |
| assert.NoError(t, err) |
| defer s.Close() |
| go s.Serve() |
|
|
| |
| echoAddr := "127.0.0.1:22333" |
| echoListener, err := net.Listen("tcp", echoAddr) |
| assert.NoError(t, err) |
| echoServer := &tcpEchoServer{Listener: echoListener} |
| defer echoServer.Close() |
| go echoServer.Serve() |
|
|
| |
| c, _, err := client.NewClient(&client.Config{ |
| ServerAddr: udpAddr, |
| TLSConfig: client.TLSConfig{InsecureSkipVerify: true}, |
| }) |
| assert.NoError(t, err) |
| defer c.Close() |
|
|
| |
| conn, err := c.TCP(echoAddr) |
| assert.NoError(t, err) |
| defer conn.Close() |
|
|
| |
| sData := []byte("hello world") |
| _, err = conn.Write(sData) |
| assert.NoError(t, err) |
| rData := make([]byte, len(sData)) |
| _, err = io.ReadFull(conn, rData) |
| assert.NoError(t, err) |
| assert.Equal(t, sData, rData) |
| } |
|
|
| |
| func TestClientServerUDPEcho(t *testing.T) { |
| |
| udpConn, udpAddr, err := serverConn() |
| assert.NoError(t, err) |
| auth := mocks.NewMockAuthenticator(t) |
| auth.EXPECT().Authenticate(mock.Anything, mock.Anything, mock.Anything).Return(true, "nobody") |
| s, err := server.NewServer(&server.Config{ |
| TLSConfig: serverTLSConfig(), |
| Conn: udpConn, |
| Authenticator: auth, |
| }) |
| assert.NoError(t, err) |
| defer s.Close() |
| go s.Serve() |
|
|
| |
| echoAddr := "127.0.0.1:22333" |
| echoConn, err := net.ListenPacket("udp", echoAddr) |
| assert.NoError(t, err) |
| echoServer := &udpEchoServer{Conn: echoConn} |
| defer echoServer.Close() |
| go echoServer.Serve() |
|
|
| |
| c, _, err := client.NewClient(&client.Config{ |
| ServerAddr: udpAddr, |
| TLSConfig: client.TLSConfig{InsecureSkipVerify: true}, |
| }) |
| assert.NoError(t, err) |
| defer c.Close() |
|
|
| |
| conn, err := c.UDP() |
| assert.NoError(t, err) |
| defer conn.Close() |
|
|
| |
| sData := []byte("hello world") |
| err = conn.Send(sData, echoAddr) |
| assert.NoError(t, err) |
| rData, rAddr, err := conn.Receive() |
| assert.NoError(t, err) |
| assert.Equal(t, sData, rData) |
| assert.Equal(t, echoAddr, rAddr) |
| } |
|
|
| |
| func TestClientServerHandshakeInfo(t *testing.T) { |
| |
| udpConn, udpAddr, err := serverConn() |
| assert.NoError(t, err) |
| auth := mocks.NewMockAuthenticator(t) |
| auth.EXPECT().Authenticate(mock.Anything, mock.Anything, mock.Anything).Return(true, "nobody") |
| s, err := server.NewServer(&server.Config{ |
| TLSConfig: serverTLSConfig(), |
| Conn: udpConn, |
| Authenticator: auth, |
| }) |
| assert.NoError(t, err) |
| go s.Serve() |
|
|
| |
| c, info, err := client.NewClient(&client.Config{ |
| ServerAddr: udpAddr, |
| TLSConfig: client.TLSConfig{InsecureSkipVerify: true}, |
| BandwidthConfig: client.BandwidthConfig{ |
| MaxTx: 123456, |
| }, |
| }) |
| assert.NoError(t, err) |
| assert.Equal(t, &client.HandshakeInfo{ |
| UDPEnabled: true, |
| Tx: 123456, |
| }, info) |
|
|
| |
| _ = s.Close() |
| _ = c.Close() |
|
|
| |
| udpConn, udpAddr, err = serverConn() |
| assert.NoError(t, err) |
| s, err = server.NewServer(&server.Config{ |
| TLSConfig: serverTLSConfig(), |
| Conn: udpConn, |
| BandwidthConfig: server.BandwidthConfig{ |
| MaxRx: 100000, |
| }, |
| DisableUDP: true, |
| Authenticator: auth, |
| }) |
| assert.NoError(t, err) |
| go s.Serve() |
|
|
| |
| c, info, err = client.NewClient(&client.Config{ |
| ServerAddr: udpAddr, |
| TLSConfig: client.TLSConfig{InsecureSkipVerify: true}, |
| BandwidthConfig: client.BandwidthConfig{ |
| MaxTx: 123456, |
| }, |
| }) |
| assert.NoError(t, err) |
| assert.Equal(t, &client.HandshakeInfo{ |
| UDPEnabled: false, |
| Tx: 100000, |
| }, info) |
|
|
| |
| _ = s.Close() |
| _ = c.Close() |
|
|
| |
| udpConn, udpAddr, err = serverConn() |
| assert.NoError(t, err) |
| s, err = server.NewServer(&server.Config{ |
| TLSConfig: serverTLSConfig(), |
| Conn: udpConn, |
| IgnoreClientBandwidth: true, |
| Authenticator: auth, |
| }) |
| assert.NoError(t, err) |
| go s.Serve() |
|
|
| |
| c, info, err = client.NewClient(&client.Config{ |
| ServerAddr: udpAddr, |
| TLSConfig: client.TLSConfig{InsecureSkipVerify: true}, |
| BandwidthConfig: client.BandwidthConfig{ |
| MaxTx: 123456, |
| }, |
| }) |
| assert.NoError(t, err) |
| assert.Equal(t, &client.HandshakeInfo{ |
| UDPEnabled: true, |
| Tx: 0, |
| }, info) |
|
|
| |
| _ = s.Close() |
| _ = c.Close() |
| } |
|
|