router_test.go 6.3 KB

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