github.com/tcnksm/go@v0.0.0-20141208075154-439b32936367/src/net/interface_unix_test.go (about)

     1  // Copyright 2013 The Go Authors.  All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // +build darwin dragonfly freebsd linux netbsd openbsd
     6  
     7  package net
     8  
     9  import (
    10  	"os"
    11  	"os/exec"
    12  	"runtime"
    13  	"testing"
    14  	"time"
    15  )
    16  
    17  type testInterface struct {
    18  	name         string
    19  	local        string
    20  	remote       string
    21  	setupCmds    []*exec.Cmd
    22  	teardownCmds []*exec.Cmd
    23  }
    24  
    25  func (ti *testInterface) setup() error {
    26  	for _, cmd := range ti.setupCmds {
    27  		if err := cmd.Run(); err != nil {
    28  			return err
    29  		}
    30  	}
    31  	return nil
    32  }
    33  
    34  func (ti *testInterface) teardown() error {
    35  	for _, cmd := range ti.teardownCmds {
    36  		if err := cmd.Run(); err != nil {
    37  			return err
    38  		}
    39  	}
    40  	return nil
    41  }
    42  
    43  func TestPointToPointInterface(t *testing.T) {
    44  	if testing.Short() {
    45  		t.Skip("skipping test in short mode")
    46  	}
    47  	switch {
    48  	case runtime.GOOS == "darwin":
    49  		t.Skipf("skipping read test on %q", runtime.GOOS)
    50  	}
    51  	if os.Getuid() != 0 {
    52  		t.Skip("skipping test; must be root")
    53  	}
    54  
    55  	local, remote := "169.254.0.1", "169.254.0.254"
    56  	ip := ParseIP(remote)
    57  	for i := 0; i < 3; i++ {
    58  		ti := &testInterface{}
    59  		if err := ti.setPointToPoint(5963+i, local, remote); err != nil {
    60  			t.Skipf("test requries external command: %v", err)
    61  		}
    62  		if err := ti.setup(); err != nil {
    63  			t.Fatalf("testInterface.setup failed: %v", err)
    64  		} else {
    65  			time.Sleep(3 * time.Millisecond)
    66  		}
    67  		ift, err := Interfaces()
    68  		if err != nil {
    69  			ti.teardown()
    70  			t.Fatalf("Interfaces failed: %v", err)
    71  		}
    72  		for _, ifi := range ift {
    73  			if ti.name == ifi.Name {
    74  				ifat, err := ifi.Addrs()
    75  				if err != nil {
    76  					ti.teardown()
    77  					t.Fatalf("Interface.Addrs failed: %v", err)
    78  				}
    79  				for _, ifa := range ifat {
    80  					if ip.Equal(ifa.(*IPNet).IP) {
    81  						ti.teardown()
    82  						t.Fatalf("got %v; want %v", ip, local)
    83  					}
    84  				}
    85  			}
    86  		}
    87  		if err := ti.teardown(); err != nil {
    88  			t.Fatalf("testInterface.teardown failed: %v", err)
    89  		} else {
    90  			time.Sleep(3 * time.Millisecond)
    91  		}
    92  	}
    93  }
    94  
    95  func TestInterfaceArrivalAndDeparture(t *testing.T) {
    96  	if testing.Short() {
    97  		t.Skip("skipping test in short mode")
    98  	}
    99  	if os.Getuid() != 0 {
   100  		t.Skip("skipping test; must be root")
   101  	}
   102  
   103  	for i := 0; i < 3; i++ {
   104  		ift1, err := Interfaces()
   105  		if err != nil {
   106  			t.Fatalf("Interfaces failed: %v", err)
   107  		}
   108  		ti := &testInterface{}
   109  		if err := ti.setBroadcast(5682 + i); err != nil {
   110  			t.Skipf("test requires external command: %v", err)
   111  		}
   112  		if err := ti.setup(); err != nil {
   113  			t.Fatalf("testInterface.setup failed: %v", err)
   114  		} else {
   115  			time.Sleep(3 * time.Millisecond)
   116  		}
   117  		ift2, err := Interfaces()
   118  		if err != nil {
   119  			ti.teardown()
   120  			t.Fatalf("Interfaces failed: %v", err)
   121  		}
   122  		if len(ift2) <= len(ift1) {
   123  			for _, ifi := range ift1 {
   124  				t.Logf("before: %v", ifi)
   125  			}
   126  			for _, ifi := range ift2 {
   127  				t.Logf("after: %v", ifi)
   128  			}
   129  			ti.teardown()
   130  			t.Fatalf("got %v; want gt %v", len(ift2), len(ift1))
   131  		}
   132  		if err := ti.teardown(); err != nil {
   133  			t.Fatalf("testInterface.teardown failed: %v", err)
   134  		} else {
   135  			time.Sleep(3 * time.Millisecond)
   136  		}
   137  		ift3, err := Interfaces()
   138  		if err != nil {
   139  			t.Fatalf("Interfaces failed: %v", err)
   140  		}
   141  		if len(ift3) >= len(ift2) {
   142  			for _, ifi := range ift2 {
   143  				t.Logf("before: %v", ifi)
   144  			}
   145  			for _, ifi := range ift3 {
   146  				t.Logf("after: %v", ifi)
   147  			}
   148  			t.Fatalf("got %v; want lt %v", len(ift3), len(ift2))
   149  		}
   150  	}
   151  }