route_test.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  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. add := func(backend map[string]*netlink.Route) func(*netlink.Route) error {
  31. return func(r *netlink.Route) error {
  32. backend[routeToString(r)] = r
  33. return nil
  34. }
  35. }
  36. del := func(backend map[string]*netlink.Route) func(*netlink.Route) error {
  37. return func(r *netlink.Route) error {
  38. delete(backend, routeToString(r))
  39. return nil
  40. }
  41. }
  42. adderr := func(backend map[string]*netlink.Route) func(*netlink.Route) error {
  43. return func(r *netlink.Route) error {
  44. return errors.New(routeToString(r))
  45. }
  46. }
  47. for _, tc := range []struct {
  48. name string
  49. routes []*netlink.Route
  50. err bool
  51. add func(map[string]*netlink.Route) func(*netlink.Route) error
  52. del func(map[string]*netlink.Route) func(*netlink.Route) error
  53. }{
  54. {
  55. name: "empty",
  56. routes: nil,
  57. err: false,
  58. add: add,
  59. del: del,
  60. },
  61. {
  62. name: "single",
  63. routes: []*netlink.Route{
  64. {
  65. Dst: c1,
  66. Gw: net.ParseIP("10.1.0.1"),
  67. },
  68. },
  69. err: false,
  70. add: add,
  71. del: del,
  72. },
  73. {
  74. name: "multiple",
  75. routes: []*netlink.Route{
  76. {
  77. Dst: c1,
  78. Gw: net.ParseIP("10.1.0.1"),
  79. },
  80. {
  81. Dst: c2,
  82. Gw: net.ParseIP("127.0.0.1"),
  83. },
  84. },
  85. err: false,
  86. add: add,
  87. del: del,
  88. },
  89. {
  90. name: "err empty",
  91. routes: nil,
  92. err: false,
  93. add: adderr,
  94. del: del,
  95. },
  96. {
  97. name: "err",
  98. routes: []*netlink.Route{
  99. {
  100. Dst: c1,
  101. Gw: net.ParseIP("10.1.0.1"),
  102. },
  103. {
  104. Dst: c2,
  105. Gw: net.ParseIP("127.0.0.1"),
  106. },
  107. },
  108. err: true,
  109. add: adderr,
  110. del: del,
  111. },
  112. } {
  113. backend := make(map[string]*netlink.Route)
  114. a := tc.add(backend)
  115. d := tc.del(backend)
  116. table := NewTable()
  117. table.add = a
  118. table.del = d
  119. if err := table.Set(tc.routes); (err != nil) != tc.err {
  120. no := "no"
  121. if tc.err {
  122. no = "an"
  123. }
  124. t.Errorf("test case %q: got unexpected result: expected %s error, got %v", tc.name, no, err)
  125. }
  126. // If no error was expected, then compare the backend to the input.
  127. if !tc.err {
  128. for _, r := range tc.routes {
  129. r1 := backend[routeToString(r)]
  130. r2 := table.routes[routeToString(r)]
  131. if r != r1 || r != r2 {
  132. t.Errorf("test case %q: expected all routes to be equal: expected %v, got %v and %v", tc.name, r, r1, r2)
  133. }
  134. }
  135. }
  136. }
  137. }
  138. func TestCleanUp(t *testing.T) {
  139. _, c1, err := net.ParseCIDR("10.2.0.0/24")
  140. if err != nil {
  141. t.Fatalf("failed to parse CIDR: %v", err)
  142. }
  143. _, c2, err := net.ParseCIDR("10.1.0.0/24")
  144. if err != nil {
  145. t.Fatalf("failed to parse CIDR: %v", err)
  146. }
  147. add := func(backend map[string]*netlink.Route) func(*netlink.Route) error {
  148. return func(r *netlink.Route) error {
  149. backend[routeToString(r)] = r
  150. return nil
  151. }
  152. }
  153. del := func(backend map[string]*netlink.Route) func(*netlink.Route) error {
  154. return func(r *netlink.Route) error {
  155. delete(backend, routeToString(r))
  156. return nil
  157. }
  158. }
  159. delerr := func(backend map[string]*netlink.Route) func(*netlink.Route) error {
  160. return func(r *netlink.Route) error {
  161. return errors.New(routeToString(r))
  162. }
  163. }
  164. for _, tc := range []struct {
  165. name string
  166. routes []*netlink.Route
  167. err bool
  168. add func(map[string]*netlink.Route) func(*netlink.Route) error
  169. del func(map[string]*netlink.Route) func(*netlink.Route) error
  170. }{
  171. {
  172. name: "empty",
  173. routes: nil,
  174. err: false,
  175. add: add,
  176. del: del,
  177. },
  178. {
  179. name: "single",
  180. routes: []*netlink.Route{
  181. {
  182. Dst: c1,
  183. Gw: net.ParseIP("10.1.0.1"),
  184. },
  185. },
  186. err: false,
  187. add: add,
  188. del: del,
  189. },
  190. {
  191. name: "multiple",
  192. routes: []*netlink.Route{
  193. {
  194. Dst: c1,
  195. Gw: net.ParseIP("10.1.0.1"),
  196. },
  197. {
  198. Dst: c2,
  199. Gw: net.ParseIP("127.0.0.1"),
  200. },
  201. },
  202. err: false,
  203. add: add,
  204. del: del,
  205. },
  206. {
  207. name: "err empty",
  208. routes: nil,
  209. err: false,
  210. add: add,
  211. del: delerr,
  212. },
  213. {
  214. name: "err",
  215. routes: []*netlink.Route{
  216. {
  217. Dst: c1,
  218. Gw: net.ParseIP("10.1.0.1"),
  219. },
  220. {
  221. Dst: c2,
  222. Gw: net.ParseIP("127.0.0.1"),
  223. },
  224. },
  225. err: true,
  226. add: add,
  227. del: delerr,
  228. },
  229. } {
  230. backend := make(map[string]*netlink.Route)
  231. a := tc.add(backend)
  232. d := tc.del(backend)
  233. table := NewTable()
  234. table.add = a
  235. table.del = d
  236. if err := table.Set(tc.routes); err != nil {
  237. t.Fatalf("test case %q: Set should not fail: %v", tc.name, err)
  238. }
  239. if err := table.CleanUp(); (err != nil) != tc.err {
  240. no := "no"
  241. if tc.err {
  242. no = "an"
  243. }
  244. t.Errorf("test case %q: got unexpected result: expected %s error, got %v", tc.name, no, err)
  245. }
  246. // If no error was expected, then compare the backend to the input.
  247. if !tc.err {
  248. for _, r := range tc.routes {
  249. r1 := backend[routeToString(r)]
  250. r2 := table.routes[routeToString(r)]
  251. if r1 != nil || r2 != nil {
  252. t.Errorf("test case %q: expected all routes to be nil: expected got %v and %v", tc.name, r1, r2)
  253. }
  254. }
  255. }
  256. }
  257. }