github.com/imannamdari/v2ray-core/v5@v5.0.5/testing/scenarios/policy_test.go (about)

     1  package scenarios
     2  
     3  import (
     4  	"io"
     5  	"testing"
     6  	"time"
     7  
     8  	"golang.org/x/sync/errgroup"
     9  	"google.golang.org/protobuf/types/known/anypb"
    10  
    11  	core "github.com/imannamdari/v2ray-core/v5"
    12  	"github.com/imannamdari/v2ray-core/v5/app/log"
    13  	"github.com/imannamdari/v2ray-core/v5/app/policy"
    14  	"github.com/imannamdari/v2ray-core/v5/app/proxyman"
    15  	"github.com/imannamdari/v2ray-core/v5/common"
    16  	clog "github.com/imannamdari/v2ray-core/v5/common/log"
    17  	"github.com/imannamdari/v2ray-core/v5/common/net"
    18  	"github.com/imannamdari/v2ray-core/v5/common/protocol"
    19  	"github.com/imannamdari/v2ray-core/v5/common/serial"
    20  	"github.com/imannamdari/v2ray-core/v5/common/uuid"
    21  	"github.com/imannamdari/v2ray-core/v5/proxy/dokodemo"
    22  	"github.com/imannamdari/v2ray-core/v5/proxy/freedom"
    23  	"github.com/imannamdari/v2ray-core/v5/proxy/vmess"
    24  	"github.com/imannamdari/v2ray-core/v5/proxy/vmess/inbound"
    25  	"github.com/imannamdari/v2ray-core/v5/proxy/vmess/outbound"
    26  	"github.com/imannamdari/v2ray-core/v5/testing/servers/tcp"
    27  )
    28  
    29  func startQuickClosingTCPServer() (net.Listener, error) {
    30  	listener, err := net.Listen("tcp", "127.0.0.1:0")
    31  	if err != nil {
    32  		return nil, err
    33  	}
    34  	go func() {
    35  		for {
    36  			conn, err := listener.Accept()
    37  			if err != nil {
    38  				break
    39  			}
    40  			b := make([]byte, 1024)
    41  			conn.Read(b)
    42  			conn.Close()
    43  		}
    44  	}()
    45  	return listener, nil
    46  }
    47  
    48  func TestVMessClosing(t *testing.T) {
    49  	tcpServer, err := startQuickClosingTCPServer()
    50  	common.Must(err)
    51  	defer tcpServer.Close()
    52  
    53  	dest := net.DestinationFromAddr(tcpServer.Addr())
    54  
    55  	userID := protocol.NewID(uuid.New())
    56  	serverPort := tcp.PickPort()
    57  	serverConfig := &core.Config{
    58  		App: []*anypb.Any{
    59  			serial.ToTypedMessage(&policy.Config{
    60  				Level: map[uint32]*policy.Policy{
    61  					0: {
    62  						Timeout: &policy.Policy_Timeout{
    63  							UplinkOnly:   &policy.Second{Value: 0},
    64  							DownlinkOnly: &policy.Second{Value: 0},
    65  						},
    66  					},
    67  				},
    68  			}),
    69  		},
    70  		Inbound: []*core.InboundHandlerConfig{
    71  			{
    72  				ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
    73  					PortRange: net.SinglePortRange(serverPort),
    74  					Listen:    net.NewIPOrDomain(net.LocalHostIP),
    75  				}),
    76  				ProxySettings: serial.ToTypedMessage(&inbound.Config{
    77  					User: []*protocol.User{
    78  						{
    79  							Account: serial.ToTypedMessage(&vmess.Account{
    80  								Id:      userID.String(),
    81  								AlterId: 0,
    82  							}),
    83  						},
    84  					},
    85  				}),
    86  			},
    87  		},
    88  		Outbound: []*core.OutboundHandlerConfig{
    89  			{
    90  				ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
    91  			},
    92  		},
    93  	}
    94  
    95  	clientPort := tcp.PickPort()
    96  	clientConfig := &core.Config{
    97  		App: []*anypb.Any{
    98  			serial.ToTypedMessage(&policy.Config{
    99  				Level: map[uint32]*policy.Policy{
   100  					0: {
   101  						Timeout: &policy.Policy_Timeout{
   102  							UplinkOnly:   &policy.Second{Value: 0},
   103  							DownlinkOnly: &policy.Second{Value: 0},
   104  						},
   105  					},
   106  				},
   107  			}),
   108  		},
   109  		Inbound: []*core.InboundHandlerConfig{
   110  			{
   111  				ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
   112  					PortRange: net.SinglePortRange(clientPort),
   113  					Listen:    net.NewIPOrDomain(net.LocalHostIP),
   114  				}),
   115  				ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
   116  					Address: net.NewIPOrDomain(dest.Address),
   117  					Port:    uint32(dest.Port),
   118  					NetworkList: &net.NetworkList{
   119  						Network: []net.Network{net.Network_TCP},
   120  					},
   121  				}),
   122  			},
   123  		},
   124  		Outbound: []*core.OutboundHandlerConfig{
   125  			{
   126  				ProxySettings: serial.ToTypedMessage(&outbound.Config{
   127  					Receiver: []*protocol.ServerEndpoint{
   128  						{
   129  							Address: net.NewIPOrDomain(net.LocalHostIP),
   130  							Port:    uint32(serverPort),
   131  							User: []*protocol.User{
   132  								{
   133  									Account: serial.ToTypedMessage(&vmess.Account{
   134  										Id:      userID.String(),
   135  										AlterId: 0,
   136  										SecuritySettings: &protocol.SecurityConfig{
   137  											Type: protocol.SecurityType_AES128_GCM,
   138  										},
   139  									}),
   140  								},
   141  							},
   142  						},
   143  					},
   144  				}),
   145  			},
   146  		},
   147  	}
   148  
   149  	servers, err := InitializeServerConfigs(serverConfig, clientConfig)
   150  	common.Must(err)
   151  	defer CloseAllServers(servers)
   152  
   153  	if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != io.EOF {
   154  		t.Error(err)
   155  	}
   156  }
   157  
   158  func TestZeroBuffer(t *testing.T) {
   159  	tcpServer := tcp.Server{
   160  		MsgProcessor: xor,
   161  	}
   162  	dest, err := tcpServer.Start()
   163  	common.Must(err)
   164  	defer tcpServer.Close()
   165  
   166  	userID := protocol.NewID(uuid.New())
   167  	serverPort := tcp.PickPort()
   168  	serverConfig := &core.Config{
   169  		App: []*anypb.Any{
   170  			serial.ToTypedMessage(&policy.Config{
   171  				Level: map[uint32]*policy.Policy{
   172  					0: {
   173  						Timeout: &policy.Policy_Timeout{
   174  							UplinkOnly:   &policy.Second{Value: 0},
   175  							DownlinkOnly: &policy.Second{Value: 0},
   176  						},
   177  						Buffer: &policy.Policy_Buffer{
   178  							Connection: 0,
   179  						},
   180  					},
   181  				},
   182  			}),
   183  		},
   184  		Inbound: []*core.InboundHandlerConfig{
   185  			{
   186  				ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
   187  					PortRange: net.SinglePortRange(serverPort),
   188  					Listen:    net.NewIPOrDomain(net.LocalHostIP),
   189  				}),
   190  				ProxySettings: serial.ToTypedMessage(&inbound.Config{
   191  					User: []*protocol.User{
   192  						{
   193  							Account: serial.ToTypedMessage(&vmess.Account{
   194  								Id:      userID.String(),
   195  								AlterId: 0,
   196  							}),
   197  						},
   198  					},
   199  				}),
   200  			},
   201  		},
   202  		Outbound: []*core.OutboundHandlerConfig{
   203  			{
   204  				ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
   205  			},
   206  		},
   207  	}
   208  
   209  	clientPort := tcp.PickPort()
   210  	clientConfig := &core.Config{
   211  		App: []*anypb.Any{
   212  			serial.ToTypedMessage(&log.Config{
   213  				Error: &log.LogSpecification{Level: clog.Severity_Debug, Type: log.LogType_Console},
   214  			}),
   215  		},
   216  		Inbound: []*core.InboundHandlerConfig{
   217  			{
   218  				ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
   219  					PortRange: net.SinglePortRange(clientPort),
   220  					Listen:    net.NewIPOrDomain(net.LocalHostIP),
   221  				}),
   222  				ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
   223  					Address: net.NewIPOrDomain(dest.Address),
   224  					Port:    uint32(dest.Port),
   225  					NetworkList: &net.NetworkList{
   226  						Network: []net.Network{net.Network_TCP},
   227  					},
   228  				}),
   229  			},
   230  		},
   231  		Outbound: []*core.OutboundHandlerConfig{
   232  			{
   233  				ProxySettings: serial.ToTypedMessage(&outbound.Config{
   234  					Receiver: []*protocol.ServerEndpoint{
   235  						{
   236  							Address: net.NewIPOrDomain(net.LocalHostIP),
   237  							Port:    uint32(serverPort),
   238  							User: []*protocol.User{
   239  								{
   240  									Account: serial.ToTypedMessage(&vmess.Account{
   241  										Id:      userID.String(),
   242  										AlterId: 0,
   243  										SecuritySettings: &protocol.SecurityConfig{
   244  											Type: protocol.SecurityType_AES128_GCM,
   245  										},
   246  									}),
   247  								},
   248  							},
   249  						},
   250  					},
   251  				}),
   252  			},
   253  		},
   254  	}
   255  
   256  	servers, err := InitializeServerConfigs(serverConfig, clientConfig)
   257  	common.Must(err)
   258  	defer CloseAllServers(servers)
   259  
   260  	var errg errgroup.Group
   261  	for i := 0; i < 10; i++ {
   262  		errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*20))
   263  	}
   264  	if err := errg.Wait(); err != nil {
   265  		t.Error(err)
   266  	}
   267  }