github.com/v2fly/v2ray-core/v5@v5.16.2-0.20240507031116-8191faa6e095/testing/scenarios/transport_test.go (about)

     1  package scenarios
     2  
     3  import (
     4  	"os"
     5  	"runtime"
     6  	"testing"
     7  	"time"
     8  
     9  	"golang.org/x/sync/errgroup"
    10  	"google.golang.org/protobuf/types/known/anypb"
    11  
    12  	core "github.com/v2fly/v2ray-core/v5"
    13  	"github.com/v2fly/v2ray-core/v5/app/log"
    14  	"github.com/v2fly/v2ray-core/v5/app/proxyman"
    15  	"github.com/v2fly/v2ray-core/v5/common"
    16  	clog "github.com/v2fly/v2ray-core/v5/common/log"
    17  	"github.com/v2fly/v2ray-core/v5/common/net"
    18  	"github.com/v2fly/v2ray-core/v5/common/protocol"
    19  	"github.com/v2fly/v2ray-core/v5/common/serial"
    20  	"github.com/v2fly/v2ray-core/v5/common/uuid"
    21  	"github.com/v2fly/v2ray-core/v5/proxy/dokodemo"
    22  	"github.com/v2fly/v2ray-core/v5/proxy/freedom"
    23  	"github.com/v2fly/v2ray-core/v5/proxy/vmess"
    24  	"github.com/v2fly/v2ray-core/v5/proxy/vmess/inbound"
    25  	"github.com/v2fly/v2ray-core/v5/proxy/vmess/outbound"
    26  	"github.com/v2fly/v2ray-core/v5/testing/servers/tcp"
    27  	"github.com/v2fly/v2ray-core/v5/testing/servers/udp"
    28  	"github.com/v2fly/v2ray-core/v5/transport/internet"
    29  	"github.com/v2fly/v2ray-core/v5/transport/internet/domainsocket"
    30  	"github.com/v2fly/v2ray-core/v5/transport/internet/headers/http"
    31  	"github.com/v2fly/v2ray-core/v5/transport/internet/headers/wechat"
    32  	"github.com/v2fly/v2ray-core/v5/transport/internet/quic"
    33  	tcptransport "github.com/v2fly/v2ray-core/v5/transport/internet/tcp"
    34  )
    35  
    36  func TestHTTPConnectionHeader(t *testing.T) {
    37  	tcpServer := tcp.Server{
    38  		MsgProcessor: xor,
    39  	}
    40  	dest, err := tcpServer.Start()
    41  	common.Must(err)
    42  	defer tcpServer.Close()
    43  
    44  	userID := protocol.NewID(uuid.New())
    45  	serverPort := tcp.PickPort()
    46  	serverConfig := &core.Config{
    47  		Inbound: []*core.InboundHandlerConfig{
    48  			{
    49  				ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
    50  					PortRange: net.SinglePortRange(serverPort),
    51  					Listen:    net.NewIPOrDomain(net.LocalHostIP),
    52  					StreamSettings: &internet.StreamConfig{
    53  						TransportSettings: []*internet.TransportConfig{
    54  							{
    55  								Protocol: internet.TransportProtocol_TCP,
    56  								Settings: serial.ToTypedMessage(&tcptransport.Config{
    57  									HeaderSettings: serial.ToTypedMessage(&http.Config{}),
    58  								}),
    59  							},
    60  						},
    61  					},
    62  				}),
    63  				ProxySettings: serial.ToTypedMessage(&inbound.Config{
    64  					User: []*protocol.User{
    65  						{
    66  							Account: serial.ToTypedMessage(&vmess.Account{
    67  								Id: userID.String(),
    68  							}),
    69  						},
    70  					},
    71  				}),
    72  			},
    73  		},
    74  		Outbound: []*core.OutboundHandlerConfig{
    75  			{
    76  				ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
    77  			},
    78  		},
    79  	}
    80  
    81  	clientPort := tcp.PickPort()
    82  	clientConfig := &core.Config{
    83  		Inbound: []*core.InboundHandlerConfig{
    84  			{
    85  				ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
    86  					PortRange: net.SinglePortRange(clientPort),
    87  					Listen:    net.NewIPOrDomain(net.LocalHostIP),
    88  				}),
    89  				ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
    90  					Address: net.NewIPOrDomain(dest.Address),
    91  					Port:    uint32(dest.Port),
    92  					NetworkList: &net.NetworkList{
    93  						Network: []net.Network{net.Network_TCP},
    94  					},
    95  				}),
    96  			},
    97  		},
    98  		Outbound: []*core.OutboundHandlerConfig{
    99  			{
   100  				ProxySettings: serial.ToTypedMessage(&outbound.Config{
   101  					Receiver: []*protocol.ServerEndpoint{
   102  						{
   103  							Address: net.NewIPOrDomain(net.LocalHostIP),
   104  							Port:    uint32(serverPort),
   105  							User: []*protocol.User{
   106  								{
   107  									Account: serial.ToTypedMessage(&vmess.Account{
   108  										Id: userID.String(),
   109  									}),
   110  								},
   111  							},
   112  						},
   113  					},
   114  				}),
   115  				SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
   116  					StreamSettings: &internet.StreamConfig{
   117  						TransportSettings: []*internet.TransportConfig{
   118  							{
   119  								Protocol: internet.TransportProtocol_TCP,
   120  								Settings: serial.ToTypedMessage(&tcptransport.Config{
   121  									HeaderSettings: serial.ToTypedMessage(&http.Config{}),
   122  								}),
   123  							},
   124  						},
   125  					},
   126  				}),
   127  			},
   128  		},
   129  	}
   130  
   131  	servers, err := InitializeServerConfigs(serverConfig, clientConfig)
   132  	common.Must(err)
   133  	defer CloseAllServers(servers)
   134  
   135  	if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != nil {
   136  		t.Error(err)
   137  	}
   138  }
   139  
   140  func TestDomainSocket(t *testing.T) {
   141  	if runtime.GOOS == "windows" || runtime.GOOS == "android" {
   142  		t.Skip("Not supported on windows and android")
   143  		return
   144  	}
   145  	tcpServer := tcp.Server{
   146  		MsgProcessor: xor,
   147  	}
   148  	dest, err := tcpServer.Start()
   149  	common.Must(err)
   150  	defer tcpServer.Close()
   151  
   152  	const dsPath = "/tmp/ds_scenario"
   153  	os.Remove(dsPath)
   154  
   155  	userID := protocol.NewID(uuid.New())
   156  	serverPort := tcp.PickPort()
   157  	serverConfig := &core.Config{
   158  		Inbound: []*core.InboundHandlerConfig{
   159  			{
   160  				ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
   161  					PortRange: net.SinglePortRange(serverPort),
   162  					Listen:    net.NewIPOrDomain(net.LocalHostIP),
   163  					StreamSettings: &internet.StreamConfig{
   164  						Protocol: internet.TransportProtocol_DomainSocket,
   165  						TransportSettings: []*internet.TransportConfig{
   166  							{
   167  								Protocol: internet.TransportProtocol_DomainSocket,
   168  								Settings: serial.ToTypedMessage(&domainsocket.Config{
   169  									Path: dsPath,
   170  								}),
   171  							},
   172  						},
   173  					},
   174  				}),
   175  				ProxySettings: serial.ToTypedMessage(&inbound.Config{
   176  					User: []*protocol.User{
   177  						{
   178  							Account: serial.ToTypedMessage(&vmess.Account{
   179  								Id: userID.String(),
   180  							}),
   181  						},
   182  					},
   183  				}),
   184  			},
   185  		},
   186  		Outbound: []*core.OutboundHandlerConfig{
   187  			{
   188  				ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
   189  			},
   190  		},
   191  	}
   192  
   193  	clientPort := tcp.PickPort()
   194  	clientConfig := &core.Config{
   195  		Inbound: []*core.InboundHandlerConfig{
   196  			{
   197  				ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
   198  					PortRange: net.SinglePortRange(clientPort),
   199  					Listen:    net.NewIPOrDomain(net.LocalHostIP),
   200  				}),
   201  				ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
   202  					Address: net.NewIPOrDomain(dest.Address),
   203  					Port:    uint32(dest.Port),
   204  					NetworkList: &net.NetworkList{
   205  						Network: []net.Network{net.Network_TCP},
   206  					},
   207  				}),
   208  			},
   209  		},
   210  		Outbound: []*core.OutboundHandlerConfig{
   211  			{
   212  				ProxySettings: serial.ToTypedMessage(&outbound.Config{
   213  					Receiver: []*protocol.ServerEndpoint{
   214  						{
   215  							Address: net.NewIPOrDomain(net.LocalHostIP),
   216  							Port:    uint32(serverPort),
   217  							User: []*protocol.User{
   218  								{
   219  									Account: serial.ToTypedMessage(&vmess.Account{
   220  										Id: userID.String(),
   221  									}),
   222  								},
   223  							},
   224  						},
   225  					},
   226  				}),
   227  				SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
   228  					StreamSettings: &internet.StreamConfig{
   229  						Protocol: internet.TransportProtocol_DomainSocket,
   230  						TransportSettings: []*internet.TransportConfig{
   231  							{
   232  								Protocol: internet.TransportProtocol_DomainSocket,
   233  								Settings: serial.ToTypedMessage(&domainsocket.Config{
   234  									Path: dsPath,
   235  								}),
   236  							},
   237  						},
   238  					},
   239  				}),
   240  			},
   241  		},
   242  	}
   243  
   244  	servers, err := InitializeServerConfigs(serverConfig, clientConfig)
   245  	common.Must(err)
   246  	defer CloseAllServers(servers)
   247  
   248  	if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != nil {
   249  		t.Error(err)
   250  	}
   251  }
   252  
   253  func TestVMessQuic(t *testing.T) {
   254  	tcpServer := tcp.Server{
   255  		MsgProcessor: xor,
   256  	}
   257  	dest, err := tcpServer.Start()
   258  	common.Must(err)
   259  	defer tcpServer.Close()
   260  
   261  	userID := protocol.NewID(uuid.New())
   262  	serverPort := udp.PickPort()
   263  	serverConfig := &core.Config{
   264  		App: []*anypb.Any{
   265  			serial.ToTypedMessage(&log.Config{
   266  				Error: &log.LogSpecification{Level: clog.Severity_Debug, Type: log.LogType_Console},
   267  			}),
   268  		},
   269  		Inbound: []*core.InboundHandlerConfig{
   270  			{
   271  				ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
   272  					PortRange: net.SinglePortRange(serverPort),
   273  					Listen:    net.NewIPOrDomain(net.LocalHostIP),
   274  					StreamSettings: &internet.StreamConfig{
   275  						ProtocolName: "quic",
   276  						TransportSettings: []*internet.TransportConfig{
   277  							{
   278  								ProtocolName: "quic",
   279  								Settings: serial.ToTypedMessage(&quic.Config{
   280  									Header: serial.ToTypedMessage(&wechat.VideoConfig{}),
   281  									Security: &protocol.SecurityConfig{
   282  										Type: protocol.SecurityType_NONE,
   283  									},
   284  								}),
   285  							},
   286  						},
   287  					},
   288  				}),
   289  				ProxySettings: serial.ToTypedMessage(&inbound.Config{
   290  					User: []*protocol.User{
   291  						{
   292  							Account: serial.ToTypedMessage(&vmess.Account{
   293  								Id:      userID.String(),
   294  								AlterId: 0,
   295  							}),
   296  						},
   297  					},
   298  				}),
   299  			},
   300  		},
   301  		Outbound: []*core.OutboundHandlerConfig{
   302  			{
   303  				ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
   304  			},
   305  		},
   306  	}
   307  
   308  	clientPort := tcp.PickPort()
   309  	clientConfig := &core.Config{
   310  		App: []*anypb.Any{
   311  			serial.ToTypedMessage(&log.Config{
   312  				Error: &log.LogSpecification{Level: clog.Severity_Debug, Type: log.LogType_Console},
   313  			}),
   314  		},
   315  		Inbound: []*core.InboundHandlerConfig{
   316  			{
   317  				ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
   318  					PortRange: net.SinglePortRange(clientPort),
   319  					Listen:    net.NewIPOrDomain(net.LocalHostIP),
   320  				}),
   321  				ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
   322  					Address: net.NewIPOrDomain(dest.Address),
   323  					Port:    uint32(dest.Port),
   324  					NetworkList: &net.NetworkList{
   325  						Network: []net.Network{net.Network_TCP},
   326  					},
   327  				}),
   328  			},
   329  		},
   330  		Outbound: []*core.OutboundHandlerConfig{
   331  			{
   332  				SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
   333  					StreamSettings: &internet.StreamConfig{
   334  						ProtocolName: "quic",
   335  						TransportSettings: []*internet.TransportConfig{
   336  							{
   337  								ProtocolName: "quic",
   338  								Settings: serial.ToTypedMessage(&quic.Config{
   339  									Header: serial.ToTypedMessage(&wechat.VideoConfig{}),
   340  									Security: &protocol.SecurityConfig{
   341  										Type: protocol.SecurityType_NONE,
   342  									},
   343  								}),
   344  							},
   345  						},
   346  					},
   347  				}),
   348  				ProxySettings: serial.ToTypedMessage(&outbound.Config{
   349  					Receiver: []*protocol.ServerEndpoint{
   350  						{
   351  							Address: net.NewIPOrDomain(net.LocalHostIP),
   352  							Port:    uint32(serverPort),
   353  							User: []*protocol.User{
   354  								{
   355  									Account: serial.ToTypedMessage(&vmess.Account{
   356  										Id:      userID.String(),
   357  										AlterId: 0,
   358  										SecuritySettings: &protocol.SecurityConfig{
   359  											Type: protocol.SecurityType_AES128_GCM,
   360  										},
   361  									}),
   362  								},
   363  							},
   364  						},
   365  					},
   366  				}),
   367  			},
   368  		},
   369  	}
   370  
   371  	servers, err := InitializeServerConfigs(serverConfig, clientConfig)
   372  	if err != nil {
   373  		t.Fatal("Failed to initialize all servers: ", err.Error())
   374  	}
   375  	defer CloseAllServers(servers)
   376  
   377  	var errg errgroup.Group
   378  	for i := 0; i < 10; i++ {
   379  		errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*40))
   380  	}
   381  
   382  	if err := errg.Wait(); err != nil {
   383  		t.Error(err)
   384  	}
   385  }