routes_test.go 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package aerotun
  2. import (
  3. "fmt"
  4. "net"
  5. "reflect"
  6. "strings"
  7. "testing"
  8. )
  9. func TestDefaultRoutePreservesUnderlayAndRollsBack(t *testing.T) {
  10. for _, fail := range []bool{false, true} {
  11. t.Run(fmt.Sprint(fail), func(t *testing.T) {
  12. var calls []string
  13. r := routeManager{run: func(a ...string) ([]byte, error) {
  14. cmd := strings.Join(a, " ")
  15. calls = append(calls, cmd)
  16. if strings.Contains(cmd, "route get") {
  17. return []byte(`[{"dev":"eth0","gateway":"192.0.2.1"}]`), nil
  18. }
  19. if strings.Contains(cmd, "show exact") {
  20. return []byte(`[]`), nil
  21. }
  22. if fail && strings.Contains(cmd, "add 128.") {
  23. return nil, fmt.Errorf("route conflict")
  24. }
  25. return nil, nil
  26. }}
  27. err := r.install("aerotun0", net.ParseIP("203.0.113.10"))
  28. if (err != nil) != fail {
  29. t.Fatalf("unexpected result: %v", err)
  30. }
  31. if !fail {
  32. r.cleanup()
  33. }
  34. want := []string{"-j -4 route get 203.0.113.10", "-j -4 route show exact 203.0.113.10/32", "-4 route add 203.0.113.10/32 via 192.0.2.1 dev eth0", "-4 route add 0.0.0.0/1 dev aerotun0", "-4 route add 128.0.0.0/1 dev aerotun0"}
  35. if !fail {
  36. want = append(want, "-4 route del 128.0.0.0/1 dev aerotun0")
  37. }
  38. want = append(want, "-4 route del 0.0.0.0/1 dev aerotun0", "-4 route del 203.0.113.10/32 via 192.0.2.1 dev eth0")
  39. if !reflect.DeepEqual(calls, want) {
  40. t.Fatalf("route operations:\n%v\nwant:\n%v", calls, want)
  41. }
  42. })
  43. }
  44. }
  45. func TestValidateConfig(t *testing.T) {
  46. base := TunnelInstance{Name: "aerotun0", Mode: "client", LocalAddress: "10.99.0.1/24", PeerAddress: "10.99.0.2/24", RemoteEndpoint: "192.0.2.1:51830", PSK: testPSK}
  47. if err := validateConfig(&base); err != nil {
  48. t.Fatal(err)
  49. }
  50. for _, mutate := range []func(*TunnelInstance){func(c *TunnelInstance) { c.Name = "lo"; c.Mode = "invalid" }, func(c *TunnelInstance) { c.PSK = "short" }, func(c *TunnelInstance) { c.MTU = 65535 }, func(c *TunnelInstance) { c.RemoteEndpoint = "" }, func(c *TunnelInstance) { c.LocalAddress = "bad" }, func(c *TunnelInstance) { c.PeerAddress = c.LocalAddress }, func(c *TunnelInstance) { c.Mode = "server"; c.DefaultRoute = true }} {
  51. c := base
  52. mutate(&c)
  53. if err := validateConfig(&c); err == nil {
  54. t.Fatalf("invalid config accepted: %+v", c)
  55. }
  56. }
  57. }
  58. func TestDefaultRouteLeavesExistingEndpointRoute(t *testing.T) {
  59. var changes []string
  60. r := routeManager{run: func(a ...string) ([]byte, error) {
  61. cmd := strings.Join(a, " ")
  62. if strings.Contains(cmd, "route get") {
  63. return []byte(`[{"dev":"eth0","gateway":"192.0.2.1"}]`), nil
  64. }
  65. if strings.Contains(cmd, "show exact") {
  66. return []byte(`[{"dst":"203.0.113.10/32","dev":"eth0"}]`), nil
  67. }
  68. changes = append(changes, cmd)
  69. return nil, nil
  70. }}
  71. if err := r.install("aerotun0", net.ParseIP("203.0.113.10")); err != nil {
  72. t.Fatal(err)
  73. }
  74. r.cleanup()
  75. for _, cmd := range changes {
  76. if strings.Contains(cmd, "203.0.113.10") {
  77. t.Fatalf("modified pre-existing endpoint route: %s", cmd)
  78. }
  79. }
  80. if len(changes) != 4 {
  81. t.Fatalf("expected two additions and two deletions: %v", changes)
  82. }
  83. }