github.com/forest33/wtun@v0.3.1/tun/tun_darwin_test.go (about) 1 package tun 2 3 import ( 4 "bytes" 5 "fmt" 6 "os/exec" 7 "testing" 8 "time" 9 ) 10 11 func TestCreate(t *testing.T) { 12 d, err := CreateTUN("utun", DefaultMTU) 13 if err != nil { 14 t.Fatalf("failed create device: %v", err) 15 } 16 17 if ev := <-d.Events(); ev != EventUp { 18 t.Fatal("device in not up") 19 } 20 21 deviceName, err := d.Name() 22 if err != nil { 23 t.Fatalf("failed to get device name: %v", err) 24 } 25 26 if err := execute(fmt.Sprintf("ifconfig %s 192.168.100.1 192.168.100.2 mtu %d up", deviceName, DefaultMTU)); err != nil { 27 t.Fatalf("failed to set interface address: %v", err) 28 } 29 if err := execute("route add -host 8.8.8.8 192.168.100.2"); err != nil { 30 t.Fatalf("failed add routing: %v", err) 31 } 32 33 go func() { 34 time.Sleep(time.Millisecond * 100) 35 _ = execute("ping -c 1 8.8.8.8") 36 }() 37 38 buf := make([]byte, DefaultMTU) 39 nr, err := d.Read(buf) 40 if err != nil { 41 t.Fatalf("failed reading from device: %v", err) 42 } 43 44 nw, err := d.Write(buf[:nr]) 45 if err != nil { 46 t.Fatalf("failed to write to device: %v", err) 47 } 48 49 if nw != nr { 50 t.Fatalf("write failed nw=%d nr=%d", nw, nr) 51 } 52 } 53 54 func execute(command string) error { 55 var stdout bytes.Buffer 56 var stderr bytes.Buffer 57 58 cmd := exec.Command("bash", append([]string{"-c"}, command)...) 59 cmd.Stdout = &stdout 60 cmd.Stderr = &stderr 61 62 return cmd.Run() 63 }