2
0

iptables_test.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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 iptables
  15. import (
  16. "testing"
  17. )
  18. var appendRules = []Rule{
  19. NewIPv4Rule("filter", "FORWARD", "-s", "10.4.0.0/16", "-j", "ACCEPT"),
  20. NewIPv4Rule("filter", "FORWARD", "-d", "10.4.0.0/16", "-j", "ACCEPT"),
  21. }
  22. var prependRules = []Rule{
  23. NewIPv4Rule("filter", "FORWARD", "-s", "10.5.0.0/16", "-j", "DROP"),
  24. NewIPv4Rule("filter", "FORWARD", "-s", "10.6.0.0/16", "-j", "DROP"),
  25. }
  26. func TestSet(t *testing.T) {
  27. for _, tc := range []struct {
  28. name string
  29. sets []RuleSet
  30. appendOut []Rule
  31. prependOut []Rule
  32. storageOut []Rule
  33. actions []func(Client) error
  34. }{
  35. {
  36. name: "empty",
  37. },
  38. {
  39. name: "single",
  40. sets: []RuleSet{
  41. {appendRules: []Rule{appendRules[0]}},
  42. },
  43. appendOut: []Rule{appendRules[0]},
  44. storageOut: []Rule{appendRules[0]},
  45. },
  46. {
  47. name: "two rules",
  48. sets: []RuleSet{
  49. {appendRules: []Rule{appendRules[0], appendRules[1]}},
  50. },
  51. appendOut: []Rule{appendRules[0], appendRules[1]},
  52. storageOut: []Rule{appendRules[0], appendRules[1]},
  53. },
  54. {
  55. name: "multiple",
  56. sets: []RuleSet{
  57. {appendRules: []Rule{appendRules[0], appendRules[1]}},
  58. {appendRules: []Rule{appendRules[1]}},
  59. },
  60. appendOut: []Rule{appendRules[1]},
  61. storageOut: []Rule{appendRules[1]},
  62. },
  63. {
  64. name: "re-add",
  65. sets: []RuleSet{
  66. {appendRules: []Rule{appendRules[0], appendRules[1]}},
  67. },
  68. appendOut: []Rule{appendRules[0], appendRules[1]},
  69. storageOut: []Rule{appendRules[0], appendRules[1]},
  70. actions: []func(c Client) error{
  71. func(c Client) error {
  72. return appendRules[0].Delete(c)
  73. },
  74. func(c Client) error {
  75. return appendRules[1].Delete(c)
  76. },
  77. },
  78. },
  79. {
  80. name: "order",
  81. sets: []RuleSet{
  82. {appendRules: []Rule{appendRules[0], appendRules[1]}},
  83. },
  84. appendOut: []Rule{appendRules[0], appendRules[1]},
  85. storageOut: []Rule{appendRules[0], appendRules[1]},
  86. actions: []func(c Client) error{
  87. func(c Client) error {
  88. return appendRules[0].Delete(c)
  89. },
  90. },
  91. },
  92. {
  93. name: "append and prepend",
  94. sets: []RuleSet{
  95. {
  96. prependRules: []Rule{prependRules[0], prependRules[1]},
  97. appendRules: []Rule{appendRules[0], appendRules[1]},
  98. },
  99. },
  100. appendOut: []Rule{appendRules[0], appendRules[1]},
  101. prependOut: []Rule{prependRules[0], prependRules[1]},
  102. storageOut: []Rule{prependRules[1], prependRules[0], appendRules[0], appendRules[1]},
  103. },
  104. } {
  105. client := &fakeClient{}
  106. controller, err := New(WithClients(client, client))
  107. if err != nil {
  108. t.Fatalf("test case %q: got unexpected error instantiating controller: %v", tc.name, err)
  109. }
  110. for i := range tc.sets {
  111. if err := controller.Set(tc.sets[i]); err != nil {
  112. t.Fatalf("test case %q: got unexpected error setting rule set %d: %v", tc.name, i, err)
  113. }
  114. }
  115. for i, f := range tc.actions {
  116. if err := f(controller.v4); err != nil {
  117. t.Fatalf("test case %q action %d: got unexpected error %v", tc.name, i, err)
  118. }
  119. }
  120. if err := controller.reconcile(); err != nil {
  121. t.Fatalf("test case %q: got unexpected error %v", tc.name, err)
  122. }
  123. if len(tc.storageOut) != len(client.storage) {
  124. t.Errorf("test case %q: expected %d rules in storage, got %d", tc.name, len(tc.storageOut), len(client.storage))
  125. } else {
  126. for i := range tc.storageOut {
  127. if tc.storageOut[i].String() != client.storage[i].String() {
  128. t.Errorf("test case %q: expected rule %d in storage to be equal: expected %v, got %v", tc.name, i, tc.storageOut[i], client.storage[i])
  129. }
  130. }
  131. }
  132. if len(tc.appendOut) != len(controller.appendRules) {
  133. t.Errorf("test case %q: expected %d appendRules in controller, got %d", tc.name, len(tc.appendOut), len(controller.appendRules))
  134. } else {
  135. for i := range tc.appendOut {
  136. if tc.appendOut[i].String() != controller.appendRules[i].String() {
  137. t.Errorf("test case %q: expected appendRule %d in controller to be equal: expected %v, got %v", tc.name, i, tc.appendOut[i], controller.appendRules[i])
  138. }
  139. }
  140. }
  141. if len(tc.prependOut) != len(controller.prependRules) {
  142. t.Errorf("test case %q: expected %d prependRules in controller, got %d", tc.name, len(tc.prependOut), len(controller.prependRules))
  143. } else {
  144. for i := range tc.prependOut {
  145. if tc.prependOut[i].String() != controller.prependRules[i].String() {
  146. t.Errorf("test case %q: expected prependRule %d in controller to be equal: expected %v, got %v", tc.name, i, tc.prependOut[i], controller.prependRules[i])
  147. }
  148. }
  149. }
  150. }
  151. }
  152. func TestCleanUp(t *testing.T) {
  153. for _, tc := range []struct {
  154. name string
  155. appendRules []Rule
  156. prependRules []Rule
  157. }{
  158. {
  159. name: "empty",
  160. appendRules: nil,
  161. },
  162. {
  163. name: "single append",
  164. appendRules: []Rule{appendRules[0]},
  165. },
  166. {
  167. name: "multiple append",
  168. appendRules: []Rule{appendRules[0], appendRules[1]},
  169. },
  170. {
  171. name: "multiple append and prepend",
  172. appendRules: []Rule{appendRules[0], appendRules[1]},
  173. prependRules: []Rule{prependRules[0], prependRules[1]},
  174. },
  175. } {
  176. client := &fakeClient{}
  177. controller, err := New(WithClients(client, client))
  178. if err != nil {
  179. t.Fatalf("test case %q: got unexpected error instantiating controller: %v", tc.name, err)
  180. }
  181. ruleSet := RuleSet{appendRules: tc.appendRules, prependRules: tc.prependRules}
  182. if err := controller.Set(ruleSet); err != nil {
  183. t.Fatalf("test case %q: Set should not fail: %v", tc.name, err)
  184. }
  185. if len(client.storage) != len(tc.appendRules)+len(tc.prependRules) {
  186. t.Errorf("test case %q: expected %d rules in storage, got %d rules", tc.name, len(ruleSet.appendRules)+len(ruleSet.prependRules), len(client.storage))
  187. }
  188. if err := controller.CleanUp(); err != nil {
  189. t.Errorf("test case %q: got unexpected error: %v", tc.name, err)
  190. }
  191. if len(client.storage) != 0 {
  192. t.Errorf("test case %q: expected storage to be empty, got %d rules", tc.name, len(client.storage))
  193. }
  194. }
  195. }
  196. func TestReconcile(t *testing.T) {
  197. for _, tc := range []struct {
  198. name string
  199. appendRules []Rule
  200. prependRules []Rule
  201. storageOut []Rule
  202. }{
  203. {
  204. name: "append and prepend rules",
  205. appendRules: []Rule{appendRules[0], appendRules[1]},
  206. prependRules: []Rule{prependRules[0], prependRules[1]},
  207. storageOut: []Rule{prependRules[1], prependRules[0], appendRules[0], appendRules[1]},
  208. },
  209. } {
  210. client := &fakeClient{}
  211. controller, err := New(WithClients(client, client))
  212. if err != nil {
  213. t.Fatalf("test case %q: got unexpected error instantiating controller: %v", tc.name, err)
  214. }
  215. controller.appendRules = tc.appendRules
  216. controller.prependRules = tc.prependRules
  217. err = controller.reconcile()
  218. if err != nil {
  219. t.Fatalf("test case %q: unexpected error during reconcile: %v", tc.name, err)
  220. }
  221. if len(tc.storageOut) != len(client.storage) {
  222. t.Errorf("test case %q: expected %d rules in storage, got %d", tc.name, len(tc.storageOut), len(client.storage))
  223. } else {
  224. for i := range tc.storageOut {
  225. if tc.storageOut[i].String() != client.storage[i].String() {
  226. t.Errorf("test case %q: expected rule %d in storage to be equal: expected %v, got %v", tc.name, i, tc.storageOut[i], client.storage[i])
  227. }
  228. }
  229. }
  230. }
  231. }