router_test.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. package conf_test
  2. import (
  3. "encoding/json"
  4. "os"
  5. "path/filepath"
  6. "testing"
  7. _ "unsafe"
  8. "github.com/golang/protobuf/proto"
  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/infra/conf"
  15. )
  16. func init() {
  17. wd, err := os.Getwd()
  18. common.Must(err)
  19. if _, err := os.Stat(platform.GetAssetLocation("geoip.dat")); err != nil && os.IsNotExist(err) {
  20. common.Must(filesystem.CopyFile(platform.GetAssetLocation("geoip.dat"), filepath.Join(wd, "..", "..", "resources", "geoip.dat")))
  21. }
  22. os.Setenv("xray.location.asset", wd)
  23. }
  24. func TestToCidrList(t *testing.T) {
  25. t.Log(os.Getenv("xray.location.asset"))
  26. common.Must(filesystem.CopyFile(platform.GetAssetLocation("geoiptestrouter.dat"), "geoip.dat"))
  27. ips := StringList([]string{
  28. "geoip:us",
  29. "geoip:cn",
  30. "geoip:!cn",
  31. "ext:geoiptestrouter.dat:!cn",
  32. "ext:geoiptestrouter.dat:ca",
  33. "ext-ip:geoiptestrouter.dat:!cn",
  34. "ext-ip:geoiptestrouter.dat:!ca",
  35. })
  36. _, err := ToCidrList(ips)
  37. if err != nil {
  38. t.Fatalf("Failed to parse geoip list, got %s", err)
  39. }
  40. }
  41. func TestRouterConfig(t *testing.T) {
  42. createParser := func() func(string) (proto.Message, error) {
  43. return func(s string) (proto.Message, error) {
  44. config := new(RouterConfig)
  45. if err := json.Unmarshal([]byte(s), config); err != nil {
  46. return nil, err
  47. }
  48. return config.Build()
  49. }
  50. }
  51. runMultiTestCase(t, []TestCase{
  52. {
  53. Input: `{
  54. "strategy": "rules",
  55. "settings": {
  56. "domainStrategy": "AsIs",
  57. "rules": [
  58. {
  59. "type": "field",
  60. "domain": [
  61. "baidu.com",
  62. "qq.com"
  63. ],
  64. "outboundTag": "direct"
  65. },
  66. {
  67. "type": "field",
  68. "ip": [
  69. "10.0.0.0/8",
  70. "::1/128"
  71. ],
  72. "outboundTag": "test"
  73. },{
  74. "type": "field",
  75. "port": "53, 443, 1000-2000",
  76. "outboundTag": "test"
  77. },{
  78. "type": "field",
  79. "port": 123,
  80. "outboundTag": "test"
  81. }
  82. ]
  83. },
  84. "balancers": [
  85. {
  86. "tag": "b1",
  87. "selector": ["test"]
  88. }
  89. ]
  90. }`,
  91. Parser: createParser(),
  92. Output: &router.Config{
  93. DomainStrategy: router.Config_AsIs,
  94. BalancingRule: []*router.BalancingRule{
  95. {
  96. Tag: "b1",
  97. OutboundSelector: []string{"test"},
  98. Strategy: "random",
  99. },
  100. },
  101. Rule: []*router.RoutingRule{
  102. {
  103. Domain: []*router.Domain{
  104. {
  105. Type: router.Domain_Plain,
  106. Value: "baidu.com",
  107. },
  108. {
  109. Type: router.Domain_Plain,
  110. Value: "qq.com",
  111. },
  112. },
  113. TargetTag: &router.RoutingRule_Tag{
  114. Tag: "direct",
  115. },
  116. },
  117. {
  118. Geoip: []*router.GeoIP{
  119. {
  120. Cidr: []*router.CIDR{
  121. {
  122. Ip: []byte{10, 0, 0, 0},
  123. Prefix: 8,
  124. },
  125. {
  126. Ip: []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  127. Prefix: 128,
  128. },
  129. },
  130. },
  131. },
  132. TargetTag: &router.RoutingRule_Tag{
  133. Tag: "test",
  134. },
  135. },
  136. {
  137. PortList: &net.PortList{
  138. Range: []*net.PortRange{
  139. {From: 53, To: 53},
  140. {From: 443, To: 443},
  141. {From: 1000, To: 2000},
  142. },
  143. },
  144. TargetTag: &router.RoutingRule_Tag{
  145. Tag: "test",
  146. },
  147. },
  148. {
  149. PortList: &net.PortList{
  150. Range: []*net.PortRange{
  151. {From: 123, To: 123},
  152. },
  153. },
  154. TargetTag: &router.RoutingRule_Tag{
  155. Tag: "test",
  156. },
  157. },
  158. },
  159. },
  160. },
  161. {
  162. Input: `{
  163. "strategy": "rules",
  164. "settings": {
  165. "domainStrategy": "IPIfNonMatch",
  166. "rules": [
  167. {
  168. "type": "field",
  169. "domain": [
  170. "baidu.com",
  171. "qq.com"
  172. ],
  173. "outboundTag": "direct"
  174. },
  175. {
  176. "type": "field",
  177. "ip": [
  178. "10.0.0.0/8",
  179. "::1/128"
  180. ],
  181. "outboundTag": "test"
  182. }
  183. ]
  184. }
  185. }`,
  186. Parser: createParser(),
  187. Output: &router.Config{
  188. DomainStrategy: router.Config_IpIfNonMatch,
  189. Rule: []*router.RoutingRule{
  190. {
  191. Domain: []*router.Domain{
  192. {
  193. Type: router.Domain_Plain,
  194. Value: "baidu.com",
  195. },
  196. {
  197. Type: router.Domain_Plain,
  198. Value: "qq.com",
  199. },
  200. },
  201. TargetTag: &router.RoutingRule_Tag{
  202. Tag: "direct",
  203. },
  204. },
  205. {
  206. Geoip: []*router.GeoIP{
  207. {
  208. Cidr: []*router.CIDR{
  209. {
  210. Ip: []byte{10, 0, 0, 0},
  211. Prefix: 8,
  212. },
  213. {
  214. Ip: []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  215. Prefix: 128,
  216. },
  217. },
  218. },
  219. },
  220. TargetTag: &router.RoutingRule_Tag{
  221. Tag: "test",
  222. },
  223. },
  224. },
  225. },
  226. },
  227. {
  228. Input: `{
  229. "domainStrategy": "AsIs",
  230. "rules": [
  231. {
  232. "type": "field",
  233. "domain": [
  234. "baidu.com",
  235. "qq.com"
  236. ],
  237. "outboundTag": "direct"
  238. },
  239. {
  240. "type": "field",
  241. "ip": [
  242. "10.0.0.0/8",
  243. "::1/128"
  244. ],
  245. "outboundTag": "test"
  246. }
  247. ]
  248. }`,
  249. Parser: createParser(),
  250. Output: &router.Config{
  251. DomainStrategy: router.Config_AsIs,
  252. Rule: []*router.RoutingRule{
  253. {
  254. Domain: []*router.Domain{
  255. {
  256. Type: router.Domain_Plain,
  257. Value: "baidu.com",
  258. },
  259. {
  260. Type: router.Domain_Plain,
  261. Value: "qq.com",
  262. },
  263. },
  264. TargetTag: &router.RoutingRule_Tag{
  265. Tag: "direct",
  266. },
  267. },
  268. {
  269. Geoip: []*router.GeoIP{
  270. {
  271. Cidr: []*router.CIDR{
  272. {
  273. Ip: []byte{10, 0, 0, 0},
  274. Prefix: 8,
  275. },
  276. {
  277. Ip: []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  278. Prefix: 128,
  279. },
  280. },
  281. },
  282. },
  283. TargetTag: &router.RoutingRule_Tag{
  284. Tag: "test",
  285. },
  286. },
  287. },
  288. },
  289. },
  290. })
  291. }