2020-11-25 11:01:53 +00:00
|
|
|
package conf_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"testing"
|
|
|
|
|
2020-12-04 01:36:16 +00:00
|
|
|
"github.com/xtls/xray-core/common/serial"
|
|
|
|
. "github.com/xtls/xray-core/infra/conf"
|
2021-03-06 16:29:17 +00:00
|
|
|
"github.com/xtls/xray-core/transport/global"
|
2020-12-04 01:36:16 +00:00
|
|
|
"github.com/xtls/xray-core/transport/internet"
|
2021-03-14 15:02:07 +00:00
|
|
|
"github.com/xtls/xray-core/transport/internet/grpc"
|
2020-12-04 01:36:16 +00:00
|
|
|
"github.com/xtls/xray-core/transport/internet/headers/http"
|
|
|
|
"github.com/xtls/xray-core/transport/internet/headers/noop"
|
|
|
|
"github.com/xtls/xray-core/transport/internet/kcp"
|
|
|
|
"github.com/xtls/xray-core/transport/internet/tcp"
|
|
|
|
"github.com/xtls/xray-core/transport/internet/websocket"
|
2023-08-10 04:43:34 +00:00
|
|
|
"google.golang.org/protobuf/proto"
|
2020-11-25 11:01:53 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestSocketConfig(t *testing.T) {
|
|
|
|
createParser := func() func(string) (proto.Message, error) {
|
|
|
|
return func(s string) (proto.Message, error) {
|
|
|
|
config := new(SocketConfig)
|
|
|
|
if err := json.Unmarshal([]byte(s), config); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return config.Build()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-30 16:42:02 +00:00
|
|
|
// test "tcpFastOpen": true, queue length 256 is expected. other parameters are tested here too
|
|
|
|
expectedOutput := &internet.SocketConfig{
|
|
|
|
Mark: 1,
|
|
|
|
Tfo: 256,
|
|
|
|
DomainStrategy: internet.DomainStrategy_USE_IP,
|
|
|
|
DialerProxy: "tag",
|
|
|
|
}
|
2020-11-25 11:01:53 +00:00
|
|
|
runMultiTestCase(t, []TestCase{
|
|
|
|
{
|
|
|
|
Input: `{
|
|
|
|
"mark": 1,
|
2021-03-06 16:29:17 +00:00
|
|
|
"tcpFastOpen": true,
|
|
|
|
"domainStrategy": "UseIP",
|
|
|
|
"dialerProxy": "tag"
|
2020-11-25 11:01:53 +00:00
|
|
|
}`,
|
|
|
|
Parser: createParser(),
|
2021-03-30 16:42:02 +00:00
|
|
|
Output: expectedOutput,
|
2021-03-06 14:45:12 +00:00
|
|
|
},
|
|
|
|
})
|
2021-03-30 16:42:02 +00:00
|
|
|
if expectedOutput.ParseTFOValue() != 256 {
|
|
|
|
t.Fatalf("unexpected parsed TFO value, which should be 256")
|
|
|
|
}
|
|
|
|
|
|
|
|
// test "tcpFastOpen": false, disabled TFO is expected
|
|
|
|
expectedOutput = &internet.SocketConfig{
|
|
|
|
Mark: 0,
|
|
|
|
Tfo: -1,
|
|
|
|
}
|
2021-03-06 14:45:12 +00:00
|
|
|
runMultiTestCase(t, []TestCase{
|
|
|
|
{
|
|
|
|
Input: `{
|
|
|
|
"tcpFastOpen": false
|
|
|
|
}`,
|
|
|
|
Parser: createParser(),
|
2021-03-30 16:42:02 +00:00
|
|
|
Output: expectedOutput,
|
2021-03-06 14:45:12 +00:00
|
|
|
},
|
|
|
|
})
|
2021-03-30 16:42:02 +00:00
|
|
|
if expectedOutput.ParseTFOValue() != 0 {
|
|
|
|
t.Fatalf("unexpected parsed TFO value, which should be 0")
|
|
|
|
}
|
|
|
|
|
|
|
|
// test "tcpFastOpen": 65535, queue length 65535 is expected
|
|
|
|
expectedOutput = &internet.SocketConfig{
|
|
|
|
Mark: 0,
|
|
|
|
Tfo: 65535,
|
|
|
|
}
|
2021-03-06 14:45:12 +00:00
|
|
|
runMultiTestCase(t, []TestCase{
|
|
|
|
{
|
|
|
|
Input: `{
|
|
|
|
"tcpFastOpen": 65535
|
|
|
|
}`,
|
|
|
|
Parser: createParser(),
|
2021-03-30 16:42:02 +00:00
|
|
|
Output: expectedOutput,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
if expectedOutput.ParseTFOValue() != 65535 {
|
|
|
|
t.Fatalf("unexpected parsed TFO value, which should be 65535")
|
|
|
|
}
|
|
|
|
|
|
|
|
// test "tcpFastOpen": -65535, disable TFO is expected
|
|
|
|
expectedOutput = &internet.SocketConfig{
|
|
|
|
Mark: 0,
|
|
|
|
Tfo: -65535,
|
|
|
|
}
|
|
|
|
runMultiTestCase(t, []TestCase{
|
|
|
|
{
|
|
|
|
Input: `{
|
|
|
|
"tcpFastOpen": -65535
|
|
|
|
}`,
|
|
|
|
Parser: createParser(),
|
|
|
|
Output: expectedOutput,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
if expectedOutput.ParseTFOValue() != 0 {
|
|
|
|
t.Fatalf("unexpected parsed TFO value, which should be 0")
|
|
|
|
}
|
|
|
|
|
|
|
|
// test "tcpFastOpen": 0, no operation is expected
|
|
|
|
expectedOutput = &internet.SocketConfig{
|
|
|
|
Mark: 0,
|
|
|
|
Tfo: 0,
|
|
|
|
}
|
|
|
|
runMultiTestCase(t, []TestCase{
|
|
|
|
{
|
|
|
|
Input: `{
|
|
|
|
"tcpFastOpen": 0
|
|
|
|
}`,
|
|
|
|
Parser: createParser(),
|
|
|
|
Output: expectedOutput,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
if expectedOutput.ParseTFOValue() != -1 {
|
|
|
|
t.Fatalf("unexpected parsed TFO value, which should be -1")
|
|
|
|
}
|
|
|
|
|
|
|
|
// test omit "tcpFastOpen", no operation is expected
|
|
|
|
expectedOutput = &internet.SocketConfig{
|
|
|
|
Mark: 0,
|
|
|
|
Tfo: 0,
|
|
|
|
}
|
|
|
|
runMultiTestCase(t, []TestCase{
|
|
|
|
{
|
|
|
|
Input: `{}`,
|
|
|
|
Parser: createParser(),
|
|
|
|
Output: expectedOutput,
|
2020-11-25 11:01:53 +00:00
|
|
|
},
|
|
|
|
})
|
2021-03-30 16:42:02 +00:00
|
|
|
if expectedOutput.ParseTFOValue() != -1 {
|
|
|
|
t.Fatalf("unexpected parsed TFO value, which should be -1")
|
|
|
|
}
|
|
|
|
|
|
|
|
// test "tcpFastOpen": null, no operation is expected
|
|
|
|
expectedOutput = &internet.SocketConfig{
|
|
|
|
Mark: 0,
|
|
|
|
Tfo: 0,
|
|
|
|
}
|
|
|
|
runMultiTestCase(t, []TestCase{
|
|
|
|
{
|
|
|
|
Input: `{
|
|
|
|
"tcpFastOpen": null
|
|
|
|
}`,
|
|
|
|
Parser: createParser(),
|
|
|
|
Output: expectedOutput,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
if expectedOutput.ParseTFOValue() != -1 {
|
|
|
|
t.Fatalf("unexpected parsed TFO value, which should be -1")
|
|
|
|
}
|
2020-11-25 11:01:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestTransportConfig(t *testing.T) {
|
|
|
|
createParser := func() func(string) (proto.Message, error) {
|
|
|
|
return func(s string) (proto.Message, error) {
|
|
|
|
config := new(TransportConfig)
|
|
|
|
if err := json.Unmarshal([]byte(s), config); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return config.Build()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
runMultiTestCase(t, []TestCase{
|
|
|
|
{
|
|
|
|
Input: `{
|
|
|
|
"tcpSettings": {
|
|
|
|
"header": {
|
|
|
|
"type": "http",
|
|
|
|
"request": {
|
|
|
|
"version": "1.1",
|
|
|
|
"method": "GET",
|
|
|
|
"path": "/b",
|
|
|
|
"headers": {
|
|
|
|
"a": "b",
|
|
|
|
"c": "d"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"response": {
|
|
|
|
"version": "1.0",
|
|
|
|
"status": "404",
|
|
|
|
"reason": "Not Found"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"kcpSettings": {
|
|
|
|
"mtu": 1200,
|
|
|
|
"header": {
|
|
|
|
"type": "none"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"wsSettings": {
|
|
|
|
"path": "/t"
|
|
|
|
},
|
2021-03-14 15:02:07 +00:00
|
|
|
"grpcSettings": {
|
|
|
|
"serviceName": "name",
|
|
|
|
"multiMode": true
|
2020-11-25 11:01:53 +00:00
|
|
|
}
|
|
|
|
}`,
|
|
|
|
Parser: createParser(),
|
2021-03-06 16:29:17 +00:00
|
|
|
Output: &global.Config{
|
2020-11-25 11:01:53 +00:00
|
|
|
TransportSettings: []*internet.TransportConfig{
|
|
|
|
{
|
|
|
|
ProtocolName: "tcp",
|
|
|
|
Settings: serial.ToTypedMessage(&tcp.Config{
|
|
|
|
HeaderSettings: serial.ToTypedMessage(&http.Config{
|
|
|
|
Request: &http.RequestConfig{
|
|
|
|
Version: &http.Version{Value: "1.1"},
|
|
|
|
Method: &http.Method{Value: "GET"},
|
|
|
|
Uri: []string{"/b"},
|
|
|
|
Header: []*http.Header{
|
|
|
|
{Name: "a", Value: []string{"b"}},
|
|
|
|
{Name: "c", Value: []string{"d"}},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Response: &http.ResponseConfig{
|
|
|
|
Version: &http.Version{Value: "1.0"},
|
|
|
|
Status: &http.Status{Code: "404", Reason: "Not Found"},
|
|
|
|
Header: []*http.Header{
|
|
|
|
{
|
|
|
|
Name: "Content-Type",
|
|
|
|
Value: []string{"application/octet-stream", "video/mpeg"},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "Transfer-Encoding",
|
|
|
|
Value: []string{"chunked"},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "Connection",
|
|
|
|
Value: []string{"keep-alive"},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "Pragma",
|
|
|
|
Value: []string{"no-cache"},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "Cache-Control",
|
|
|
|
Value: []string{"private", "no-cache"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}),
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ProtocolName: "mkcp",
|
|
|
|
Settings: serial.ToTypedMessage(&kcp.Config{
|
|
|
|
Mtu: &kcp.MTU{Value: 1200},
|
|
|
|
HeaderConfig: serial.ToTypedMessage(&noop.Config{}),
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ProtocolName: "websocket",
|
|
|
|
Settings: serial.ToTypedMessage(&websocket.Config{
|
|
|
|
Path: "/t",
|
|
|
|
}),
|
|
|
|
},
|
2021-03-14 15:02:07 +00:00
|
|
|
{
|
|
|
|
ProtocolName: "grpc",
|
|
|
|
Settings: serial.ToTypedMessage(&grpc.Config{
|
|
|
|
ServiceName: "name",
|
|
|
|
MultiMode: true,
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Input: `{
|
|
|
|
"gunSettings": {
|
|
|
|
"serviceName": "name"
|
|
|
|
}
|
|
|
|
}`,
|
|
|
|
Parser: createParser(),
|
|
|
|
Output: &global.Config{
|
|
|
|
TransportSettings: []*internet.TransportConfig{
|
|
|
|
{
|
|
|
|
ProtocolName: "grpc",
|
|
|
|
Settings: serial.ToTypedMessage(&grpc.Config{
|
|
|
|
ServiceName: "name",
|
|
|
|
}),
|
|
|
|
},
|
2020-11-25 11:01:53 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|