|
@@ -0,0 +1,129 @@
|
|
|
+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 TestVMessSelf(t *testing.T) {
|
|
|
+ t.Parallel()
|
|
|
+ for _, security := range []string{
|
|
|
+ "zero",
|
|
|
+ } {
|
|
|
+ t.Run(security, func(t *testing.T) {
|
|
|
+ testVMessSelf0(t, security)
|
|
|
+ })
|
|
|
+ }
|
|
|
+ for _, security := range []string{
|
|
|
+ "aes-128-gcm", "chacha20-poly1305", "aes-128-cfb",
|
|
|
+ } {
|
|
|
+ t.Run(security, func(t *testing.T) {
|
|
|
+ testVMessSelf1(t, security)
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func testVMessSelf0(t *testing.T, security string) {
|
|
|
+ t.Parallel()
|
|
|
+ user, err := uuid.DefaultGenerator.NewV4()
|
|
|
+ require.NoError(t, err)
|
|
|
+ t.Run("default", func(t *testing.T) {
|
|
|
+ testVMessSelf2(t, security, user.String(), false, false)
|
|
|
+ })
|
|
|
+ t.Run("padding", func(t *testing.T) {
|
|
|
+ testVMessSelf2(t, security, user.String(), true, false)
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+func testVMessSelf1(t *testing.T, security string) {
|
|
|
+ t.Parallel()
|
|
|
+ user, err := uuid.DefaultGenerator.NewV4()
|
|
|
+ require.NoError(t, err)
|
|
|
+ t.Run("default", func(t *testing.T) {
|
|
|
+ testVMessSelf2(t, security, user.String(), false, false)
|
|
|
+ })
|
|
|
+ t.Run("padding", func(t *testing.T) {
|
|
|
+ testVMessSelf2(t, security, user.String(), true, false)
|
|
|
+ })
|
|
|
+ t.Run("authid", func(t *testing.T) {
|
|
|
+ testVMessSelf2(t, security, user.String(), false, true)
|
|
|
+ })
|
|
|
+ t.Run("padding-authid", func(t *testing.T) {
|
|
|
+ testVMessSelf2(t, security, user.String(), true, true)
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+func testVMessSelf2(t *testing.T, security string, uuid string, globalPadding bool, authenticatedLength bool) {
|
|
|
+ t.Parallel()
|
|
|
+ serverPort := mkPort(t)
|
|
|
+ clientPort := mkPort(t)
|
|
|
+ testPort := mkPort(t)
|
|
|
+ startInstance(t, option.Options{
|
|
|
+ Log: &option.LogOption{
|
|
|
+ Level: "error",
|
|
|
+ },
|
|
|
+ Inbounds: []option.Inbound{
|
|
|
+ {
|
|
|
+ Type: C.TypeMixed,
|
|
|
+ Tag: "mixed-in",
|
|
|
+ MixedOptions: option.HTTPMixedInboundOptions{
|
|
|
+ ListenOptions: option.ListenOptions{
|
|
|
+ Listen: option.ListenAddress(netip.IPv4Unspecified()),
|
|
|
+ ListenPort: clientPort,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Type: C.TypeVMess,
|
|
|
+ VMessOptions: option.VMessInboundOptions{
|
|
|
+ ListenOptions: option.ListenOptions{
|
|
|
+ Listen: option.ListenAddress(netip.IPv4Unspecified()),
|
|
|
+ ListenPort: serverPort,
|
|
|
+ },
|
|
|
+ Users: []option.VMessUser{
|
|
|
+ {
|
|
|
+ Name: "sekai",
|
|
|
+ UUID: uuid,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 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,
|
|
|
+ },
|
|
|
+ Security: security,
|
|
|
+ UUID: uuid,
|
|
|
+ GlobalPadding: globalPadding,
|
|
|
+ AuthenticatedLength: authenticatedLength,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ Route: &option.RouteOptions{
|
|
|
+ Rules: []option.Rule{
|
|
|
+ {
|
|
|
+ DefaultOptions: option.DefaultRule{
|
|
|
+ Inbound: []string{"mixed-in"},
|
|
|
+ Outbound: "vmess-out",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ })
|
|
|
+ testSuit(t, clientPort, testPort)
|
|
|
+}
|