router_test.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. package conf_test
  2. import (
  3. "encoding/json"
  4. "testing"
  5. "time"
  6. _ "unsafe"
  7. "github.com/golang/protobuf/proto"
  8. "github.com/v2fly/v2ray-core/v4/app/router"
  9. "github.com/v2fly/v2ray-core/v4/common/net"
  10. "github.com/v2fly/v2ray-core/v4/common/serial"
  11. . "github.com/v2fly/v2ray-core/v4/infra/conf"
  12. )
  13. func TestRouterConfig(t *testing.T) {
  14. createParser := func() func(string) (proto.Message, error) {
  15. return func(s string) (proto.Message, error) {
  16. config := new(RouterConfig)
  17. if err := json.Unmarshal([]byte(s), config); err != nil {
  18. return nil, err
  19. }
  20. return config.Build()
  21. }
  22. }
  23. runMultiTestCase(t, []TestCase{
  24. {
  25. Input: `{
  26. "strategy": "rules",
  27. "settings": {
  28. "domainStrategy": "AsIs",
  29. "rules": [
  30. {
  31. "type": "field",
  32. "domain": [
  33. "baidu.com",
  34. "qq.com"
  35. ],
  36. "outboundTag": "direct"
  37. },
  38. {
  39. "type": "field",
  40. "domains": [
  41. "v2fly.org",
  42. "github.com"
  43. ],
  44. "outboundTag": "direct"
  45. },
  46. {
  47. "type": "field",
  48. "ip": [
  49. "10.0.0.0/8",
  50. "::1/128"
  51. ],
  52. "outboundTag": "test"
  53. },{
  54. "type": "field",
  55. "port": "53, 443, 1000-2000",
  56. "outboundTag": "test"
  57. },{
  58. "type": "field",
  59. "port": 123,
  60. "outboundTag": "test"
  61. }
  62. ]
  63. },
  64. "balancers": [
  65. {
  66. "tag": "b1",
  67. "selector": ["test"]
  68. },
  69. {
  70. "tag": "b2",
  71. "selector": ["test"],
  72. "strategy": {
  73. "type": "leastload",
  74. "settings": {
  75. "healthCheck": {
  76. "interval": "5m0s",
  77. "sampling": 2,
  78. "timeout": "5s",
  79. "destination": "dest",
  80. "connectivity": "conn"
  81. },
  82. "costs": [
  83. {
  84. "regexp": true,
  85. "match": "\\d+(\\.\\d+)",
  86. "value": 5
  87. }
  88. ],
  89. "baselines": ["400ms", "600ms"],
  90. "expected": 6,
  91. "maxRTT": "1000ms",
  92. "tolerance": 0.5
  93. }
  94. },
  95. "fallbackTag": "fall"
  96. }
  97. ]
  98. }`,
  99. Parser: createParser(),
  100. Output: &router.Config{
  101. DomainStrategy: router.Config_AsIs,
  102. BalancingRule: []*router.BalancingRule{
  103. {
  104. Tag: "b1",
  105. OutboundSelector: []string{"test"},
  106. Strategy: "random",
  107. },
  108. {
  109. Tag: "b2",
  110. OutboundSelector: []string{"test"},
  111. Strategy: "leastload",
  112. StrategySettings: serial.ToTypedMessage(&router.StrategyLeastLoadConfig{
  113. Costs: []*router.StrategyWeight{
  114. {
  115. Regexp: true,
  116. Match: "\\d+(\\.\\d+)",
  117. Value: 5,
  118. },
  119. },
  120. Baselines: []int64{
  121. int64(time.Duration(400) * time.Millisecond),
  122. int64(time.Duration(600) * time.Millisecond),
  123. },
  124. Expected: 6,
  125. MaxRTT: int64(time.Duration(1000) * time.Millisecond),
  126. Tolerance: 0.5,
  127. }),
  128. FallbackTag: "fall",
  129. },
  130. },
  131. Rule: []*router.RoutingRule{
  132. {
  133. Domain: []*router.Domain{
  134. {
  135. Type: router.Domain_Plain,
  136. Value: "baidu.com",
  137. },
  138. {
  139. Type: router.Domain_Plain,
  140. Value: "qq.com",
  141. },
  142. },
  143. TargetTag: &router.RoutingRule_Tag{
  144. Tag: "direct",
  145. },
  146. },
  147. {
  148. Domain: []*router.Domain{
  149. {
  150. Type: router.Domain_Plain,
  151. Value: "v2fly.org",
  152. },
  153. {
  154. Type: router.Domain_Plain,
  155. Value: "github.com",
  156. },
  157. },
  158. TargetTag: &router.RoutingRule_Tag{
  159. Tag: "direct",
  160. },
  161. },
  162. {
  163. Geoip: []*router.GeoIP{
  164. {
  165. Cidr: []*router.CIDR{
  166. {
  167. Ip: []byte{10, 0, 0, 0},
  168. Prefix: 8,
  169. },
  170. {
  171. Ip: []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  172. Prefix: 128,
  173. },
  174. },
  175. },
  176. },
  177. TargetTag: &router.RoutingRule_Tag{
  178. Tag: "test",
  179. },
  180. },
  181. {
  182. PortList: &net.PortList{
  183. Range: []*net.PortRange{
  184. {From: 53, To: 53},
  185. {From: 443, To: 443},
  186. {From: 1000, To: 2000},
  187. },
  188. },
  189. TargetTag: &router.RoutingRule_Tag{
  190. Tag: "test",
  191. },
  192. },
  193. {
  194. PortList: &net.PortList{
  195. Range: []*net.PortRange{
  196. {From: 123, To: 123},
  197. },
  198. },
  199. TargetTag: &router.RoutingRule_Tag{
  200. Tag: "test",
  201. },
  202. },
  203. },
  204. },
  205. },
  206. {
  207. Input: `{
  208. "strategy": "rules",
  209. "settings": {
  210. "domainStrategy": "IPIfNonMatch",
  211. "rules": [
  212. {
  213. "type": "field",
  214. "domain": [
  215. "baidu.com",
  216. "qq.com"
  217. ],
  218. "outboundTag": "direct"
  219. },
  220. {
  221. "type": "field",
  222. "domains": [
  223. "v2fly.org",
  224. "github.com"
  225. ],
  226. "outboundTag": "direct"
  227. },
  228. {
  229. "type": "field",
  230. "ip": [
  231. "10.0.0.0/8",
  232. "::1/128"
  233. ],
  234. "outboundTag": "test"
  235. }
  236. ]
  237. }
  238. }`,
  239. Parser: createParser(),
  240. Output: &router.Config{
  241. DomainStrategy: router.Config_IpIfNonMatch,
  242. Rule: []*router.RoutingRule{
  243. {
  244. Domain: []*router.Domain{
  245. {
  246. Type: router.Domain_Plain,
  247. Value: "baidu.com",
  248. },
  249. {
  250. Type: router.Domain_Plain,
  251. Value: "qq.com",
  252. },
  253. },
  254. TargetTag: &router.RoutingRule_Tag{
  255. Tag: "direct",
  256. },
  257. },
  258. {
  259. Domain: []*router.Domain{
  260. {
  261. Type: router.Domain_Plain,
  262. Value: "v2fly.org",
  263. },
  264. {
  265. Type: router.Domain_Plain,
  266. Value: "github.com",
  267. },
  268. },
  269. TargetTag: &router.RoutingRule_Tag{
  270. Tag: "direct",
  271. },
  272. },
  273. {
  274. Geoip: []*router.GeoIP{
  275. {
  276. Cidr: []*router.CIDR{
  277. {
  278. Ip: []byte{10, 0, 0, 0},
  279. Prefix: 8,
  280. },
  281. {
  282. Ip: []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  283. Prefix: 128,
  284. },
  285. },
  286. },
  287. },
  288. TargetTag: &router.RoutingRule_Tag{
  289. Tag: "test",
  290. },
  291. },
  292. },
  293. },
  294. },
  295. {
  296. Input: `{
  297. "domainStrategy": "AsIs",
  298. "rules": [
  299. {
  300. "type": "field",
  301. "domain": [
  302. "baidu.com",
  303. "qq.com"
  304. ],
  305. "outboundTag": "direct"
  306. },
  307. {
  308. "type": "field",
  309. "domains": [
  310. "v2fly.org",
  311. "github.com"
  312. ],
  313. "outboundTag": "direct"
  314. },
  315. {
  316. "type": "field",
  317. "ip": [
  318. "10.0.0.0/8",
  319. "::1/128"
  320. ],
  321. "outboundTag": "test"
  322. }
  323. ]
  324. }`,
  325. Parser: createParser(),
  326. Output: &router.Config{
  327. DomainStrategy: router.Config_AsIs,
  328. Rule: []*router.RoutingRule{
  329. {
  330. Domain: []*router.Domain{
  331. {
  332. Type: router.Domain_Plain,
  333. Value: "baidu.com",
  334. },
  335. {
  336. Type: router.Domain_Plain,
  337. Value: "qq.com",
  338. },
  339. },
  340. TargetTag: &router.RoutingRule_Tag{
  341. Tag: "direct",
  342. },
  343. },
  344. {
  345. Domain: []*router.Domain{
  346. {
  347. Type: router.Domain_Plain,
  348. Value: "v2fly.org",
  349. },
  350. {
  351. Type: router.Domain_Plain,
  352. Value: "github.com",
  353. },
  354. },
  355. TargetTag: &router.RoutingRule_Tag{
  356. Tag: "direct",
  357. },
  358. },
  359. {
  360. Geoip: []*router.GeoIP{
  361. {
  362. Cidr: []*router.CIDR{
  363. {
  364. Ip: []byte{10, 0, 0, 0},
  365. Prefix: 8,
  366. },
  367. {
  368. Ip: []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  369. Prefix: 128,
  370. },
  371. },
  372. },
  373. },
  374. TargetTag: &router.RoutingRule_Tag{
  375. Tag: "test",
  376. },
  377. },
  378. },
  379. },
  380. },
  381. })
  382. }