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