github.com/labulakalia/water@v0.0.5-0.20231118024244-f351ca6784b6/ipv4_linux_test.go (about)

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