route_test.go 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. // Copyright 2019 the Kilo authors
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package route
  15. import (
  16. "errors"
  17. "net"
  18. "testing"
  19. "github.com/vishvananda/netlink"
  20. )
  21. func TestSet(t *testing.T) {
  22. _, c1, err := net.ParseCIDR("10.2.0.0/24")
  23. if err != nil {
  24. t.Fatalf("failed to parse CIDR: %v", err)
  25. }
  26. _, c2, err := net.ParseCIDR("10.1.0.0/24")
  27. if err != nil {
  28. t.Fatalf("failed to parse CIDR: %v", err)
  29. }
  30. addRoute := func(backend map[string]interface{}) func(*netlink.Route) error {
  31. return func(r *netlink.Route) error {
  32. backend[routeToString(r)] = r
  33. return nil
  34. }
  35. }
  36. delRoute := func(backend map[string]interface{}) func(*netlink.Route) error {
  37. return func(r *netlink.Route) error {
  38. delete(backend, routeToString(r))
  39. return nil
  40. }
  41. }
  42. addRule := func(backend map[string]interface{}) func(*netlink.Rule) error {
  43. return func(r *netlink.Rule) error {
  44. backend[ruleToString(r)] = r
  45. return nil
  46. }
  47. }
  48. delRule := func(backend map[string]interface{}) func(*netlink.Rule) error {
  49. return func(r *netlink.Rule) error {
  50. delete(backend, ruleToString(r))
  51. return nil
  52. }
  53. }
  54. adderr := func(backend map[string]interface{}) func(*netlink.Route) error {
  55. return func(r *netlink.Route) error {
  56. return errors.New(routeToString(r))
  57. }
  58. }
  59. for _, tc := range []struct {
  60. name string
  61. routes []*netlink.Route
  62. rules []*netlink.Rule
  63. err bool
  64. addRoute func(map[string]interface{}) func(*netlink.Route) error
  65. delRoute func(map[string]interface{}) func(*netlink.Route) error
  66. addRule func(map[string]interface{}) func(*netlink.Rule) error
  67. delRule func(map[string]interface{}) func(*netlink.Rule) error
  68. }{
  69. {
  70. name: "empty",
  71. routes: nil,
  72. rules: nil,
  73. err: false,
  74. addRoute: addRoute,
  75. delRoute: delRoute,
  76. addRule: addRule,
  77. delRule: delRule,
  78. },
  79. {
  80. name: "single",
  81. routes: []*netlink.Route{
  82. {
  83. Dst: c1,
  84. Gw: net.ParseIP("10.1.0.1"),
  85. },
  86. },
  87. rules: []*netlink.Rule{
  88. {
  89. Src: c1,
  90. Table: 1,
  91. },
  92. },
  93. err: false,
  94. addRoute: addRoute,
  95. delRoute: delRoute,
  96. addRule: addRule,
  97. delRule: delRule,
  98. },
  99. {
  100. name: "multiple",
  101. routes: []*netlink.Route{
  102. {
  103. Dst: c1,
  104. Gw: net.ParseIP("10.1.0.1"),
  105. },
  106. {
  107. Dst: c2,
  108. Gw: net.ParseIP("127.0.0.1"),
  109. },
  110. },
  111. rules: []*netlink.Rule{
  112. {
  113. Src: c1,
  114. Table: 1,
  115. },
  116. {
  117. Src: c2,
  118. Table: 2,
  119. },
  120. },
  121. err: false,
  122. addRoute: addRoute,
  123. delRoute: delRoute,
  124. addRule: addRule,
  125. delRule: delRule,
  126. },
  127. {
  128. name: "err empty",
  129. routes: nil,
  130. err: false,
  131. addRoute: adderr,
  132. delRoute: delRoute,
  133. addRule: addRule,
  134. delRule: delRule,
  135. },
  136. {
  137. name: "err",
  138. routes: []*netlink.Route{
  139. {
  140. Dst: c1,
  141. Gw: net.ParseIP("10.1.0.1"),
  142. },
  143. {
  144. Dst: c2,
  145. Gw: net.ParseIP("127.0.0.1"),
  146. },
  147. },
  148. rules: []*netlink.Rule{
  149. {
  150. Src: c1,
  151. Table: 1,
  152. },
  153. {
  154. Src: c2,
  155. Table: 2,
  156. },
  157. },
  158. err: true,
  159. addRoute: adderr,
  160. delRoute: delRoute,
  161. addRule: addRule,
  162. delRule: delRule,
  163. },
  164. } {
  165. backend := make(map[string]interface{})
  166. table := NewTable()
  167. table.addRoute = tc.addRoute(backend)
  168. table.delRoute = tc.delRoute(backend)
  169. table.addRule = tc.addRule(backend)
  170. table.delRule = tc.delRule(backend)
  171. if err := table.Set(tc.routes, tc.rules); (err != nil) != tc.err {
  172. no := "no"
  173. if tc.err {
  174. no = "an"
  175. }
  176. t.Errorf("test case %q: got unexpected result: expected %s error, got %v", tc.name, no, err)
  177. }
  178. // If no error was expected, then compare the backend to the input.
  179. if !tc.err {
  180. for _, r := range tc.routes {
  181. r1 := backend[routeToString(r)]
  182. r2 := table.rs[routeToString(r)]
  183. if r != r1 || r != r2 {
  184. t.Errorf("test case %q: expected all routes to be equal: expected %v, got %v and %v", tc.name, r, r1, r2)
  185. }
  186. }
  187. for _, r := range tc.rules {
  188. r1 := backend[ruleToString(r)]
  189. r2 := table.rs[ruleToString(r)]
  190. if r != r1 || r != r2 {
  191. t.Errorf("test case %q: expected all rules to be equal: expected %v, got %v and %v", tc.name, r, r1, r2)
  192. }
  193. }
  194. }
  195. }
  196. }
  197. func TestCleanUp(t *testing.T) {
  198. _, c1, err := net.ParseCIDR("10.2.0.0/24")
  199. if err != nil {
  200. t.Fatalf("failed to parse CIDR: %v", err)
  201. }
  202. _, c2, err := net.ParseCIDR("10.1.0.0/24")
  203. if err != nil {
  204. t.Fatalf("failed to parse CIDR: %v", err)
  205. }
  206. addRoute := func(backend map[string]interface{}) func(*netlink.Route) error {
  207. return func(r *netlink.Route) error {
  208. backend[routeToString(r)] = r
  209. return nil
  210. }
  211. }
  212. delRoute := func(backend map[string]interface{}) func(*netlink.Route) error {
  213. return func(r *netlink.Route) error {
  214. delete(backend, routeToString(r))
  215. return nil
  216. }
  217. }
  218. addRule := func(backend map[string]interface{}) func(*netlink.Rule) error {
  219. return func(r *netlink.Rule) error {
  220. backend[ruleToString(r)] = r
  221. return nil
  222. }
  223. }
  224. delRule := func(backend map[string]interface{}) func(*netlink.Rule) error {
  225. return func(r *netlink.Rule) error {
  226. delete(backend, ruleToString(r))
  227. return nil
  228. }
  229. }
  230. delerr := func(backend map[string]interface{}) func(*netlink.Route) error {
  231. return func(r *netlink.Route) error {
  232. return errors.New(routeToString(r))
  233. }
  234. }
  235. for _, tc := range []struct {
  236. name string
  237. routes []*netlink.Route
  238. rules []*netlink.Rule
  239. err bool
  240. addRoute func(map[string]interface{}) func(*netlink.Route) error
  241. delRoute func(map[string]interface{}) func(*netlink.Route) error
  242. addRule func(map[string]interface{}) func(*netlink.Rule) error
  243. delRule func(map[string]interface{}) func(*netlink.Rule) error
  244. }{
  245. {
  246. name: "empty",
  247. routes: nil,
  248. err: false,
  249. addRoute: addRoute,
  250. delRoute: delRoute,
  251. addRule: addRule,
  252. delRule: delRule,
  253. },
  254. {
  255. name: "single",
  256. routes: []*netlink.Route{
  257. {
  258. Dst: c1,
  259. Gw: net.ParseIP("10.1.0.1"),
  260. },
  261. },
  262. rules: []*netlink.Rule{
  263. {
  264. Src: c1,
  265. Table: 1,
  266. },
  267. },
  268. err: false,
  269. addRoute: addRoute,
  270. delRoute: delRoute,
  271. addRule: addRule,
  272. delRule: delRule,
  273. },
  274. {
  275. name: "multiple",
  276. routes: []*netlink.Route{
  277. {
  278. Dst: c1,
  279. Gw: net.ParseIP("10.1.0.1"),
  280. },
  281. {
  282. Dst: c2,
  283. Gw: net.ParseIP("127.0.0.1"),
  284. },
  285. },
  286. rules: []*netlink.Rule{
  287. {
  288. Src: c1,
  289. Table: 1,
  290. },
  291. {
  292. Src: c2,
  293. Table: 2,
  294. },
  295. },
  296. err: false,
  297. addRoute: addRoute,
  298. delRoute: delRoute,
  299. addRule: addRule,
  300. delRule: delRule,
  301. },
  302. {
  303. name: "err empty",
  304. routes: nil,
  305. err: false,
  306. addRoute: addRoute,
  307. delRoute: delRoute,
  308. addRule: addRule,
  309. delRule: delRule,
  310. },
  311. {
  312. name: "err",
  313. routes: []*netlink.Route{
  314. {
  315. Dst: c1,
  316. Gw: net.ParseIP("10.1.0.1"),
  317. },
  318. {
  319. Dst: c2,
  320. Gw: net.ParseIP("127.0.0.1"),
  321. },
  322. },
  323. rules: []*netlink.Rule{
  324. {
  325. Src: c1,
  326. Table: 1,
  327. },
  328. {
  329. Src: c2,
  330. Table: 2,
  331. },
  332. },
  333. err: true,
  334. addRoute: addRoute,
  335. delRoute: delerr,
  336. addRule: addRule,
  337. delRule: delRule,
  338. },
  339. } {
  340. backend := make(map[string]interface{})
  341. table := NewTable()
  342. table.addRoute = tc.addRoute(backend)
  343. table.delRoute = tc.delRoute(backend)
  344. table.addRule = tc.addRule(backend)
  345. table.delRule = tc.delRule(backend)
  346. if err := table.Set(tc.routes, tc.rules); err != nil {
  347. t.Fatalf("test case %q: Set should not fail: %v", tc.name, err)
  348. }
  349. if err := table.CleanUp(); (err != nil) != tc.err {
  350. no := "no"
  351. if tc.err {
  352. no = "an"
  353. }
  354. t.Errorf("test case %q: got unexpected result: expected %s error, got %v", tc.name, no, err)
  355. }
  356. // If no error was expected, then compare the backend to the input.
  357. if !tc.err {
  358. for _, r := range tc.routes {
  359. r1 := backend[routeToString(r)]
  360. r2 := table.rs[routeToString(r)]
  361. if r1 != nil || r2 != nil {
  362. t.Errorf("test case %q: expected all routes to be nil: expected nil, got %v and %v", tc.name, r1, r2)
  363. }
  364. }
  365. }
  366. if !tc.err {
  367. for _, r := range tc.rules {
  368. r1 := backend[ruleToString(r)]
  369. r2 := table.rs[ruleToString(r)]
  370. if r1 != nil || r2 != nil {
  371. t.Errorf("test case %q: expected all rules to be nil: expected nil, got %v and %v", tc.name, r1, r2)
  372. }
  373. }
  374. }
  375. }
  376. }