router_test.go 7.3 KB

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