| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334 | 
							- package main
 
- import (
 
- 	"net/netip"
 
- 	"testing"
 
- 	C "github.com/sagernet/sing-box/constant"
 
- 	"github.com/sagernet/sing-box/option"
 
- 	"github.com/gofrs/uuid"
 
- 	"github.com/stretchr/testify/require"
 
- )
 
- func TestV2RayHTTPSelf(t *testing.T) {
 
- 	testV2RayTransportSelf(t, &option.V2RayTransportOptions{
 
- 		Type: C.V2RayTransportTypeHTTP,
 
- 		HTTPOptions: option.V2RayHTTPOptions{
 
- 			Method: "POST",
 
- 		},
 
- 	})
 
- }
 
- func TestV2RayHTTPPlainSelf(t *testing.T) {
 
- 	testV2RayTransportNOTLSSelf(t, &option.V2RayTransportOptions{
 
- 		Type: C.V2RayTransportTypeHTTP,
 
- 	})
 
- }
 
- func testV2RayTransportSelf(t *testing.T, transport *option.V2RayTransportOptions) {
 
- 	testV2RayTransportSelfWith(t, transport, transport)
 
- }
 
- func testV2RayTransportSelfWith(t *testing.T, server, client *option.V2RayTransportOptions) {
 
- 	t.Run("vmess", func(t *testing.T) {
 
- 		testVMessTransportSelf(t, server, client)
 
- 	})
 
- 	t.Run("trojan", func(t *testing.T) {
 
- 		testTrojanTransportSelf(t, server, client)
 
- 	})
 
- }
 
- func testVMessTransportSelf(t *testing.T, server *option.V2RayTransportOptions, client *option.V2RayTransportOptions) {
 
- 	user, err := uuid.DefaultGenerator.NewV4()
 
- 	require.NoError(t, err)
 
- 	_, certPem, keyPem := createSelfSignedCertificate(t, "example.org")
 
- 	startInstance(t, option.Options{
 
- 		Inbounds: []option.Inbound{
 
- 			{
 
- 				Type: C.TypeMixed,
 
- 				Tag:  "mixed-in",
 
- 				MixedOptions: option.HTTPMixedInboundOptions{
 
- 					ListenOptions: option.ListenOptions{
 
- 						Listen:     option.NewListenAddress(netip.IPv4Unspecified()),
 
- 						ListenPort: clientPort,
 
- 					},
 
- 				},
 
- 			},
 
- 			{
 
- 				Type: C.TypeVMess,
 
- 				VMessOptions: option.VMessInboundOptions{
 
- 					ListenOptions: option.ListenOptions{
 
- 						Listen:     option.NewListenAddress(netip.IPv4Unspecified()),
 
- 						ListenPort: serverPort,
 
- 					},
 
- 					Users: []option.VMessUser{
 
- 						{
 
- 							Name: "sekai",
 
- 							UUID: user.String(),
 
- 						},
 
- 					},
 
- 					TLS: &option.InboundTLSOptions{
 
- 						Enabled:         true,
 
- 						ServerName:      "example.org",
 
- 						CertificatePath: certPem,
 
- 						KeyPath:         keyPem,
 
- 					},
 
- 					Transport: server,
 
- 				},
 
- 			},
 
- 		},
 
- 		Outbounds: []option.Outbound{
 
- 			{
 
- 				Type: C.TypeDirect,
 
- 			},
 
- 			{
 
- 				Type: C.TypeVMess,
 
- 				Tag:  "vmess-out",
 
- 				VMessOptions: option.VMessOutboundOptions{
 
- 					ServerOptions: option.ServerOptions{
 
- 						Server:     "127.0.0.1",
 
- 						ServerPort: serverPort,
 
- 					},
 
- 					UUID:     user.String(),
 
- 					Security: "zero",
 
- 					TLS: &option.OutboundTLSOptions{
 
- 						Enabled:         true,
 
- 						ServerName:      "example.org",
 
- 						CertificatePath: certPem,
 
- 					},
 
- 					Transport: client,
 
- 				},
 
- 			},
 
- 		},
 
- 		Route: &option.RouteOptions{
 
- 			Rules: []option.Rule{
 
- 				{
 
- 					DefaultOptions: option.DefaultRule{
 
- 						Inbound:  []string{"mixed-in"},
 
- 						Outbound: "vmess-out",
 
- 					},
 
- 				},
 
- 			},
 
- 		},
 
- 	})
 
- 	testSuit(t, clientPort, testPort)
 
- }
 
- func testTrojanTransportSelf(t *testing.T, server *option.V2RayTransportOptions, client *option.V2RayTransportOptions) {
 
- 	user, err := uuid.DefaultGenerator.NewV4()
 
- 	require.NoError(t, err)
 
- 	_, certPem, keyPem := createSelfSignedCertificate(t, "example.org")
 
- 	startInstance(t, option.Options{
 
- 		Inbounds: []option.Inbound{
 
- 			{
 
- 				Type: C.TypeMixed,
 
- 				Tag:  "mixed-in",
 
- 				MixedOptions: option.HTTPMixedInboundOptions{
 
- 					ListenOptions: option.ListenOptions{
 
- 						Listen:     option.NewListenAddress(netip.IPv4Unspecified()),
 
- 						ListenPort: clientPort,
 
- 					},
 
- 				},
 
- 			},
 
- 			{
 
- 				Type: C.TypeTrojan,
 
- 				TrojanOptions: option.TrojanInboundOptions{
 
- 					ListenOptions: option.ListenOptions{
 
- 						Listen:     option.NewListenAddress(netip.IPv4Unspecified()),
 
- 						ListenPort: serverPort,
 
- 					},
 
- 					Users: []option.TrojanUser{
 
- 						{
 
- 							Name:     "sekai",
 
- 							Password: user.String(),
 
- 						},
 
- 					},
 
- 					TLS: &option.InboundTLSOptions{
 
- 						Enabled:         true,
 
- 						ServerName:      "example.org",
 
- 						CertificatePath: certPem,
 
- 						KeyPath:         keyPem,
 
- 					},
 
- 					Transport: server,
 
- 				},
 
- 			},
 
- 		},
 
- 		Outbounds: []option.Outbound{
 
- 			{
 
- 				Type: C.TypeDirect,
 
- 			},
 
- 			{
 
- 				Type: C.TypeTrojan,
 
- 				Tag:  "vmess-out",
 
- 				TrojanOptions: option.TrojanOutboundOptions{
 
- 					ServerOptions: option.ServerOptions{
 
- 						Server:     "127.0.0.1",
 
- 						ServerPort: serverPort,
 
- 					},
 
- 					Password: user.String(),
 
- 					TLS: &option.OutboundTLSOptions{
 
- 						Enabled:         true,
 
- 						ServerName:      "example.org",
 
- 						CertificatePath: certPem,
 
- 					},
 
- 					Transport: client,
 
- 				},
 
- 			},
 
- 		},
 
- 		Route: &option.RouteOptions{
 
- 			Rules: []option.Rule{
 
- 				{
 
- 					DefaultOptions: option.DefaultRule{
 
- 						Inbound:  []string{"mixed-in"},
 
- 						Outbound: "vmess-out",
 
- 					},
 
- 				},
 
- 			},
 
- 		},
 
- 	})
 
- 	testSuit(t, clientPort, testPort)
 
- }
 
- func TestVMessQUICSelf(t *testing.T) {
 
- 	transport := &option.V2RayTransportOptions{
 
- 		Type: C.V2RayTransportTypeQUIC,
 
- 	}
 
- 	user, err := uuid.DefaultGenerator.NewV4()
 
- 	require.NoError(t, err)
 
- 	_, certPem, keyPem := createSelfSignedCertificate(t, "example.org")
 
- 	startInstance(t, option.Options{
 
- 		Inbounds: []option.Inbound{
 
- 			{
 
- 				Type: C.TypeMixed,
 
- 				Tag:  "mixed-in",
 
- 				MixedOptions: option.HTTPMixedInboundOptions{
 
- 					ListenOptions: option.ListenOptions{
 
- 						Listen:     option.NewListenAddress(netip.IPv4Unspecified()),
 
- 						ListenPort: clientPort,
 
- 					},
 
- 				},
 
- 			},
 
- 			{
 
- 				Type: C.TypeVMess,
 
- 				VMessOptions: option.VMessInboundOptions{
 
- 					ListenOptions: option.ListenOptions{
 
- 						Listen:     option.NewListenAddress(netip.IPv4Unspecified()),
 
- 						ListenPort: serverPort,
 
- 					},
 
- 					Users: []option.VMessUser{
 
- 						{
 
- 							Name: "sekai",
 
- 							UUID: user.String(),
 
- 						},
 
- 					},
 
- 					TLS: &option.InboundTLSOptions{
 
- 						Enabled:         true,
 
- 						ServerName:      "example.org",
 
- 						CertificatePath: certPem,
 
- 						KeyPath:         keyPem,
 
- 					},
 
- 					Transport: transport,
 
- 				},
 
- 			},
 
- 		},
 
- 		Outbounds: []option.Outbound{
 
- 			{
 
- 				Type: C.TypeDirect,
 
- 			},
 
- 			{
 
- 				Type: C.TypeVMess,
 
- 				Tag:  "vmess-out",
 
- 				VMessOptions: option.VMessOutboundOptions{
 
- 					ServerOptions: option.ServerOptions{
 
- 						Server:     "127.0.0.1",
 
- 						ServerPort: serverPort,
 
- 					},
 
- 					UUID:     user.String(),
 
- 					Security: "zero",
 
- 					TLS: &option.OutboundTLSOptions{
 
- 						Enabled:         true,
 
- 						ServerName:      "example.org",
 
- 						CertificatePath: certPem,
 
- 					},
 
- 					Transport: transport,
 
- 				},
 
- 			},
 
- 		},
 
- 		Route: &option.RouteOptions{
 
- 			Rules: []option.Rule{
 
- 				{
 
- 					DefaultOptions: option.DefaultRule{
 
- 						Inbound:  []string{"mixed-in"},
 
- 						Outbound: "vmess-out",
 
- 					},
 
- 				},
 
- 			},
 
- 		},
 
- 	})
 
- 	testSuitSimple1(t, clientPort, testPort)
 
- }
 
- func testV2RayTransportNOTLSSelf(t *testing.T, transport *option.V2RayTransportOptions) {
 
- 	user, err := uuid.DefaultGenerator.NewV4()
 
- 	require.NoError(t, err)
 
- 	startInstance(t, option.Options{
 
- 		Inbounds: []option.Inbound{
 
- 			{
 
- 				Type: C.TypeMixed,
 
- 				Tag:  "mixed-in",
 
- 				MixedOptions: option.HTTPMixedInboundOptions{
 
- 					ListenOptions: option.ListenOptions{
 
- 						Listen:     option.NewListenAddress(netip.IPv4Unspecified()),
 
- 						ListenPort: clientPort,
 
- 					},
 
- 				},
 
- 			},
 
- 			{
 
- 				Type: C.TypeVMess,
 
- 				VMessOptions: option.VMessInboundOptions{
 
- 					ListenOptions: option.ListenOptions{
 
- 						Listen:     option.NewListenAddress(netip.IPv4Unspecified()),
 
- 						ListenPort: serverPort,
 
- 					},
 
- 					Users: []option.VMessUser{
 
- 						{
 
- 							Name: "sekai",
 
- 							UUID: user.String(),
 
- 						},
 
- 					},
 
- 					Transport: transport,
 
- 				},
 
- 			},
 
- 		},
 
- 		Outbounds: []option.Outbound{
 
- 			{
 
- 				Type: C.TypeDirect,
 
- 			},
 
- 			{
 
- 				Type: C.TypeVMess,
 
- 				Tag:  "vmess-out",
 
- 				VMessOptions: option.VMessOutboundOptions{
 
- 					ServerOptions: option.ServerOptions{
 
- 						Server:     "127.0.0.1",
 
- 						ServerPort: serverPort,
 
- 					},
 
- 					UUID:      user.String(),
 
- 					Security:  "zero",
 
- 					Transport: transport,
 
- 				},
 
- 			},
 
- 		},
 
- 		Route: &option.RouteOptions{
 
- 			Rules: []option.Rule{
 
- 				{
 
- 					DefaultOptions: option.DefaultRule{
 
- 						Inbound:  []string{"mixed-in"},
 
- 						Outbound: "vmess-out",
 
- 					},
 
- 				},
 
- 			},
 
- 		},
 
- 	})
 
- 	testSuit(t, clientPort, testPort)
 
- }
 
 
  |