From a1eaabc0565c2d9c8cb7fceab0b59d66f37116ff Mon Sep 17 00:00:00 2001 From: Song Gao Date: Sun, 6 Jan 2019 13:41:27 -0800 Subject: [PATCH] fix darwin tests --- ipv4_darwin_test.go | 67 ++++++++++++++++++++++++++++++++++++++ ipv4_linux_test.go | 77 ++++++++++++++++++++++++++++++++++++++++++++ ipv4_test.go | 55 ------------------------------- ipv4_unix_test.go | 24 -------------- ipv4_windows_test.go | 55 +++++++++++++++++++++++++++++++ 5 files changed, 199 insertions(+), 79 deletions(-) create mode 100644 ipv4_darwin_test.go create mode 100644 ipv4_linux_test.go delete mode 100644 ipv4_unix_test.go diff --git a/ipv4_darwin_test.go b/ipv4_darwin_test.go new file mode 100644 index 0000000..886a929 --- /dev/null +++ b/ipv4_darwin_test.go @@ -0,0 +1,67 @@ +// +build linux darwin + +package water + +import ( + "net" + "os/exec" + "testing" + "time" + + "github.com/songgao/water/waterutil" +) + +func startPing(t *testing.T, dst net.IP) { + if err := exec.Command("ping", "-c", "2", dst.String()).Start(); err != nil { + t.Fatal(err) + } +} + +func setupIfce(t *testing.T, self net.IP, remote net.IP, dev string) { + if err := exec.Command("ifconfig", dev, "inet", self.String(), remote.String(), "up").Run(); err != nil { + t.Fatal(err) + } +} + +func TestP2PTUN(t *testing.T) { + var ( + self = net.IPv4(10, 0, 42, 1) + remote = net.IPv4(10, 0, 42, 2) + ) + + ifce, err := New(Config{DeviceType: TUN}) + if err != nil { + t.Fatalf("creating TUN error: %v\n", err) + } + + setupIfce(t, self, remote, ifce.Name()) + startPing(t, remote) + + dataCh := make(chan []byte, 8) + startRead(dataCh, ifce) + + timeout := time.NewTimer(8 * time.Second).C + +readFrame: + for { + select { + case packet := <-dataCh: + if !waterutil.IsIPv4(packet) { + continue readFrame + } + if !waterutil.IPv4Source(packet).Equal(self) { + continue readFrame + } + if !waterutil.IPv4Destination(packet).Equal(remote) { + continue readFrame + } + if waterutil.IPv4Protocol(packet) != waterutil.ICMP { + continue readFrame + } + t.Logf("received broadcast packet: %#v\n", packet) + break readFrame + case <-timeout: + t.Fatal("Waiting for broadcast packet timeout") + } + } +} diff --git a/ipv4_linux_test.go b/ipv4_linux_test.go new file mode 100644 index 0000000..bb06a72 --- /dev/null +++ b/ipv4_linux_test.go @@ -0,0 +1,77 @@ +package water + +import ( + "net" + "os/exec" + "testing" + "time" + + "github.com/songgao/water/waterutil" +) + +func startBroadcast(t *testing.T, dst net.IP) { + if err := exec.Command("ping", "-b", "-c", "2", dst.String()).Start(); err != nil { + t.Fatal(err) + } +} + +func setupIfce(t *testing.T, ipNet net.IPNet, dev string) { + if err := exec.Command("ip", "link", "set", dev, "up").Run(); err != nil { + t.Fatal(err) + } + if err := exec.Command("ip", "addr", "add", ipNet.String(), "dev", dev).Run(); err != nil { + t.Fatal(err) + } +} + +func TestBroadcastTAP(t *testing.T) { + var ( + self = net.IPv4(10, 0, 42, 1) + mask = net.IPv4Mask(255, 255, 255, 0) + brd = net.IPv4(10, 0, 42, 255) + ) + + ifce, err := New(Config{DeviceType: TAP}) + if err != nil { + t.Fatalf("creating TAP error: %v\n", err) + } + + setupIfce(t, net.IPNet{IP: self, Mask: mask}, ifce.Name()) + startBroadcast(t, brd) + + dataCh := make(chan []byte, 8) + startRead(dataCh, ifce) + + timeout := time.NewTimer(8 * time.Second).C + +readFrame: + for { + select { + case buffer := <-dataCh: + ethertype := waterutil.MACEthertype(buffer) + if ethertype != waterutil.IPv4 { + continue readFrame + } + if !waterutil.IsBroadcast(waterutil.MACDestination(buffer)) { + continue readFrame + } + packet := waterutil.MACPayload(buffer) + if !waterutil.IsIPv4(packet) { + continue readFrame + } + if !waterutil.IPv4Source(packet).Equal(self) { + continue readFrame + } + if !waterutil.IPv4Destination(packet).Equal(brd) { + continue readFrame + } + if waterutil.IPv4Protocol(packet) != waterutil.ICMP { + continue readFrame + } + t.Logf("received broadcast frame: %#v\n", buffer) + break readFrame + case <-timeout: + t.Fatal("Waiting for broadcast packet timeout") + } + } +} diff --git a/ipv4_test.go b/ipv4_test.go index 8b3886c..ea660c1 100644 --- a/ipv4_test.go +++ b/ipv4_test.go @@ -2,11 +2,8 @@ package water import ( "context" - "net" "testing" "time" - - "github.com/songgao/water/waterutil" ) const BUFFERSIZE = 1522 @@ -24,58 +21,6 @@ func startRead(ch chan<- []byte, ifce *Interface) { }() } -func TestBroadcast(t *testing.T) { - var ( - self = net.IPv4(10, 0, 42, 1) - mask = net.IPv4Mask(255, 255, 255, 0) - brd = net.IPv4(10, 0, 42, 255) - ) - - ifce, err := New(Config{DeviceType: TAP}) - if err != nil { - t.Fatalf("creating TAP error: %v\n", err) - } - - setupIfce(t, net.IPNet{IP: self, Mask: mask}, ifce.Name()) - startBroadcast(t, brd) - - dataCh := make(chan []byte, 8) - startRead(dataCh, ifce) - - timeout := time.NewTimer(8 * time.Second).C - -readFrame: - for { - select { - case buffer := <-dataCh: - ethertype := waterutil.MACEthertype(buffer) - if ethertype != waterutil.IPv4 { - continue readFrame - } - if !waterutil.IsBroadcast(waterutil.MACDestination(buffer)) { - continue readFrame - } - packet := waterutil.MACPayload(buffer) - if !waterutil.IsIPv4(packet) { - continue readFrame - } - if !waterutil.IPv4Source(packet).Equal(self) { - continue readFrame - } - if !waterutil.IPv4Destination(packet).Equal(brd) { - continue readFrame - } - if waterutil.IPv4Protocol(packet) != waterutil.ICMP { - continue readFrame - } - t.Logf("received broadcast frame: %#v\n", buffer) - break readFrame - case <-timeout: - t.Fatal("Waiting for broadcast packet timeout") - } - } -} - func TestCloseUnblockPendingRead(t *testing.T) { ifce, err := New(Config{DeviceType: TUN}) if err != nil { diff --git a/ipv4_unix_test.go b/ipv4_unix_test.go deleted file mode 100644 index 9d1705c..0000000 --- a/ipv4_unix_test.go +++ /dev/null @@ -1,24 +0,0 @@ -// +build linux darwin - -package water - -import ( - "net" - "os/exec" - "testing" -) - -func startBroadcast(t *testing.T, dst net.IP) { - if err := exec.Command("ping", "-b", "-c", "2", dst.String()).Start(); err != nil { - t.Fatal(err) - } -} - -func setupIfce(t *testing.T, ipNet net.IPNet, dev string) { - if err := exec.Command("ip", "link", "set", dev, "up").Run(); err != nil { - t.Fatal(err) - } - if err := exec.Command("ip", "addr", "add", ipNet.String(), "dev", dev).Run(); err != nil { - t.Fatal(err) - } -} diff --git a/ipv4_windows_test.go b/ipv4_windows_test.go index 6a46e7c..cce3f73 100644 --- a/ipv4_windows_test.go +++ b/ipv4_windows_test.go @@ -7,6 +7,9 @@ import ( "os/exec" "strings" "testing" + "time" + + "github.com/songgao/water/waterutil" ) func startBroadcast(t *testing.T, dst net.IP) { @@ -26,3 +29,55 @@ func setupIfce(t *testing.T, ipNet net.IPNet, dev string) { t.Fatal(err) } } + +func TestBroadcastTAP(t *testing.T) { + var ( + self = net.IPv4(10, 0, 42, 1) + mask = net.IPv4Mask(255, 255, 255, 0) + brd = net.IPv4(10, 0, 42, 255) + ) + + ifce, err := New(Config{DeviceType: TAP}) + if err != nil { + t.Fatalf("creating TAP error: %v\n", err) + } + + setupIfce(t, net.IPNet{IP: self, Mask: mask}, ifce.Name()) + startBroadcast(t, brd) + + dataCh := make(chan []byte, 8) + startRead(dataCh, ifce) + + timeout := time.NewTimer(8 * time.Second).C + +readFrame: + for { + select { + case buffer := <-dataCh: + ethertype := waterutil.MACEthertype(buffer) + if ethertype != waterutil.IPv4 { + continue readFrame + } + if !waterutil.IsBroadcast(waterutil.MACDestination(buffer)) { + continue readFrame + } + packet := waterutil.MACPayload(buffer) + if !waterutil.IsIPv4(packet) { + continue readFrame + } + if !waterutil.IPv4Source(packet).Equal(self) { + continue readFrame + } + if !waterutil.IPv4Destination(packet).Equal(brd) { + continue readFrame + } + if waterutil.IPv4Protocol(packet) != waterutil.ICMP { + continue readFrame + } + t.Logf("received broadcast frame: %#v\n", buffer) + break readFrame + case <-timeout: + t.Fatal("Waiting for broadcast packet timeout") + } + } +}