| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394 |
- package conf_test
- import (
- "encoding/json"
- "testing"
- "time"
- _ "unsafe"
- "github.com/golang/protobuf/proto"
- "github.com/v2fly/v2ray-core/v4/app/router"
- "github.com/v2fly/v2ray-core/v4/common/net"
- "github.com/v2fly/v2ray-core/v4/common/serial"
- . "github.com/v2fly/v2ray-core/v4/infra/conf"
- )
- func TestRouterConfig(t *testing.T) {
- createParser := func() func(string) (proto.Message, error) {
- return func(s string) (proto.Message, error) {
- config := new(RouterConfig)
- if err := json.Unmarshal([]byte(s), config); err != nil {
- return nil, err
- }
- return config.Build()
- }
- }
- runMultiTestCase(t, []TestCase{
- {
- Input: `{
- "strategy": "rules",
- "settings": {
- "domainStrategy": "AsIs",
- "rules": [
- {
- "type": "field",
- "domain": [
- "baidu.com",
- "qq.com"
- ],
- "outboundTag": "direct"
- },
- {
- "type": "field",
- "domains": [
- "v2fly.org",
- "github.com"
- ],
- "outboundTag": "direct"
- },
- {
- "type": "field",
- "ip": [
- "10.0.0.0/8",
- "::1/128"
- ],
- "outboundTag": "test"
- },{
- "type": "field",
- "port": "53, 443, 1000-2000",
- "outboundTag": "test"
- },{
- "type": "field",
- "port": 123,
- "outboundTag": "test"
- }
- ]
- },
- "balancers": [
- {
- "tag": "b1",
- "selector": ["test"]
- },
- {
- "tag": "b2",
- "selector": ["test"],
- "strategy": {
- "type": "leastload",
- "settings": {
- "healthCheck": {
- "interval": 300,
- "sampling": 2,
- "timeout": 3,
- "destination": "dest",
- "connectivity": "conn"
- },
- "costs": [
- {
- "regexp": true,
- "match": "\\d+(\\.\\d+)",
- "value": 5
- }
- ],
- "baselines": [400, 600],
- "expected": 6,
- "maxRTT": 1000,
- "tolerance": 0.5
- }
- },
- "fallbackTag": "fall"
- }
- ]
- }`,
- Parser: createParser(),
- Output: &router.Config{
- DomainStrategy: router.Config_AsIs,
- BalancingRule: []*router.BalancingRule{
- {
- Tag: "b1",
- OutboundSelector: []string{"test"},
- Strategy: "random",
- },
- {
- Tag: "b2",
- OutboundSelector: []string{"test"},
- Strategy: "leastload",
- StrategySettings: serial.ToTypedMessage(&router.StrategyLeastLoadConfig{
- HealthCheck: &router.HealthPingConfig{
- Interval: int64(time.Duration(300) * time.Second),
- SamplingCount: 2,
- Timeout: int64(time.Duration(3) * time.Second),
- Destination: "dest",
- Connectivity: "conn",
- },
- Costs: []*router.StrategyWeight{
- {
- Regexp: true,
- Match: "\\d+(\\.\\d+)",
- Value: 5,
- },
- },
- Baselines: []int64{
- int64(time.Duration(400) * time.Millisecond),
- int64(time.Duration(600) * time.Millisecond),
- },
- Expected: 6,
- MaxRTT: int64(time.Duration(1000) * time.Millisecond),
- Tolerance: 0.5,
- }),
- FallbackTag: "fall",
- },
- },
- Rule: []*router.RoutingRule{
- {
- Domain: []*router.Domain{
- {
- Type: router.Domain_Plain,
- Value: "baidu.com",
- },
- {
- Type: router.Domain_Plain,
- Value: "qq.com",
- },
- },
- TargetTag: &router.RoutingRule_Tag{
- Tag: "direct",
- },
- },
- {
- Domain: []*router.Domain{
- {
- Type: router.Domain_Plain,
- Value: "v2fly.org",
- },
- {
- Type: router.Domain_Plain,
- Value: "github.com",
- },
- },
- TargetTag: &router.RoutingRule_Tag{
- Tag: "direct",
- },
- },
- {
- Geoip: []*router.GeoIP{
- {
- Cidr: []*router.CIDR{
- {
- Ip: []byte{10, 0, 0, 0},
- Prefix: 8,
- },
- {
- Ip: []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
- Prefix: 128,
- },
- },
- },
- },
- TargetTag: &router.RoutingRule_Tag{
- Tag: "test",
- },
- },
- {
- PortList: &net.PortList{
- Range: []*net.PortRange{
- {From: 53, To: 53},
- {From: 443, To: 443},
- {From: 1000, To: 2000},
- },
- },
- TargetTag: &router.RoutingRule_Tag{
- Tag: "test",
- },
- },
- {
- PortList: &net.PortList{
- Range: []*net.PortRange{
- {From: 123, To: 123},
- },
- },
- TargetTag: &router.RoutingRule_Tag{
- Tag: "test",
- },
- },
- },
- },
- },
- {
- Input: `{
- "strategy": "rules",
- "settings": {
- "domainStrategy": "IPIfNonMatch",
- "rules": [
- {
- "type": "field",
- "domain": [
- "baidu.com",
- "qq.com"
- ],
- "outboundTag": "direct"
- },
- {
- "type": "field",
- "domains": [
- "v2fly.org",
- "github.com"
- ],
- "outboundTag": "direct"
- },
- {
- "type": "field",
- "ip": [
- "10.0.0.0/8",
- "::1/128"
- ],
- "outboundTag": "test"
- }
- ]
- }
- }`,
- Parser: createParser(),
- Output: &router.Config{
- DomainStrategy: router.Config_IpIfNonMatch,
- Rule: []*router.RoutingRule{
- {
- Domain: []*router.Domain{
- {
- Type: router.Domain_Plain,
- Value: "baidu.com",
- },
- {
- Type: router.Domain_Plain,
- Value: "qq.com",
- },
- },
- TargetTag: &router.RoutingRule_Tag{
- Tag: "direct",
- },
- },
- {
- Domain: []*router.Domain{
- {
- Type: router.Domain_Plain,
- Value: "v2fly.org",
- },
- {
- Type: router.Domain_Plain,
- Value: "github.com",
- },
- },
- TargetTag: &router.RoutingRule_Tag{
- Tag: "direct",
- },
- },
- {
- Geoip: []*router.GeoIP{
- {
- Cidr: []*router.CIDR{
- {
- Ip: []byte{10, 0, 0, 0},
- Prefix: 8,
- },
- {
- Ip: []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
- Prefix: 128,
- },
- },
- },
- },
- TargetTag: &router.RoutingRule_Tag{
- Tag: "test",
- },
- },
- },
- },
- },
- {
- Input: `{
- "domainStrategy": "AsIs",
- "rules": [
- {
- "type": "field",
- "domain": [
- "baidu.com",
- "qq.com"
- ],
- "outboundTag": "direct"
- },
- {
- "type": "field",
- "domains": [
- "v2fly.org",
- "github.com"
- ],
- "outboundTag": "direct"
- },
- {
- "type": "field",
- "ip": [
- "10.0.0.0/8",
- "::1/128"
- ],
- "outboundTag": "test"
- }
- ]
- }`,
- Parser: createParser(),
- Output: &router.Config{
- DomainStrategy: router.Config_AsIs,
- Rule: []*router.RoutingRule{
- {
- Domain: []*router.Domain{
- {
- Type: router.Domain_Plain,
- Value: "baidu.com",
- },
- {
- Type: router.Domain_Plain,
- Value: "qq.com",
- },
- },
- TargetTag: &router.RoutingRule_Tag{
- Tag: "direct",
- },
- },
- {
- Domain: []*router.Domain{
- {
- Type: router.Domain_Plain,
- Value: "v2fly.org",
- },
- {
- Type: router.Domain_Plain,
- Value: "github.com",
- },
- },
- TargetTag: &router.RoutingRule_Tag{
- Tag: "direct",
- },
- },
- {
- Geoip: []*router.GeoIP{
- {
- Cidr: []*router.CIDR{
- {
- Ip: []byte{10, 0, 0, 0},
- Prefix: 8,
- },
- {
- Ip: []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
- Prefix: 128,
- },
- },
- },
- },
- TargetTag: &router.RoutingRule_Tag{
- Tag: "test",
- },
- },
- },
- },
- },
- })
- }
|