ipv4_linux_test.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package water
  2. import (
  3. "net"
  4. "os/exec"
  5. "testing"
  6. )
  7. func startPing(t *testing.T, dst net.IP, dashB bool) {
  8. params := []string{"-c", "4", dst.String()}
  9. if dashB {
  10. params = append([]string{"-b"}, params...)
  11. }
  12. if err := exec.Command("ping", params...).Start(); err != nil {
  13. t.Fatal(err)
  14. }
  15. }
  16. func setupIfce(t *testing.T, ipNet net.IPNet, dev string) {
  17. if err := exec.Command("ip", "link", "set", dev, "up").Run(); err != nil {
  18. t.Fatal(err)
  19. }
  20. if err := exec.Command("ip", "addr", "add", ipNet.String(), "dev", dev).Run(); err != nil {
  21. t.Fatal(err)
  22. }
  23. }
  24. func teardownIfce(t *testing.T, ifce *Interface) {
  25. if err := ifce.Close(); err != nil {
  26. t.Fatal(err)
  27. }
  28. if err := exec.Command("ip", "link", "set", ifce.Name(), "down").Run(); err != nil {
  29. t.Fatal(err)
  30. }
  31. }
  32. func TestBroadcastTAP(t *testing.T) {
  33. var (
  34. self = net.IPv4(10, 0, 42, 1)
  35. mask = net.IPv4Mask(255, 255, 255, 0)
  36. brd = net.IPv4(10, 0, 42, 255)
  37. )
  38. ifce, err := New(Config{DeviceType: TAP})
  39. if err != nil {
  40. t.Fatalf("creating TAP error: %v\n", err)
  41. }
  42. defer teardownIfce(t, ifce)
  43. dataCh, errCh := startRead(t, ifce)
  44. setupIfce(t, net.IPNet{IP: self, Mask: mask}, ifce.Name())
  45. startPing(t, brd, true)
  46. waitForPingOrBust(t, true, true, self, brd, dataCh, errCh)
  47. }
  48. func TestBroadcastTUN(t *testing.T) {
  49. var (
  50. self = net.IPv4(10, 0, 42, 1)
  51. mask = net.IPv4Mask(255, 255, 255, 0)
  52. brd = net.IPv4(10, 0, 42, 255)
  53. )
  54. ifce, err := New(Config{DeviceType: TUN})
  55. if err != nil {
  56. t.Fatalf("creating TUN error: %v\n", err)
  57. }
  58. defer teardownIfce(t, ifce)
  59. dataCh, errCh := startRead(t, ifce)
  60. setupIfce(t, net.IPNet{IP: self, Mask: mask}, ifce.Name())
  61. startPing(t, brd, true)
  62. waitForPingOrBust(t, false, true, self, brd, dataCh, errCh)
  63. }
  64. func TestUnicastTUN(t *testing.T) {
  65. var (
  66. self = net.IPv4(10, 0, 42, 1)
  67. mask = net.IPv4Mask(255, 255, 255, 0)
  68. remote = net.IPv4(10, 0, 42, 2)
  69. )
  70. ifce, err := New(Config{DeviceType: TUN})
  71. if err != nil {
  72. t.Fatalf("creating TUN error: %v\n", err)
  73. }
  74. defer teardownIfce(t, ifce)
  75. dataCh, errCh := startRead(t, ifce)
  76. setupIfce(t, net.IPNet{IP: self, Mask: mask}, ifce.Name())
  77. startPing(t, remote, false)
  78. waitForPingOrBust(t, false, false, self, remote, dataCh, errCh)
  79. }