Mikio Hara | 30be488 | 2016-04-23 22:36:41 +0900 | [diff] [blame] | 1 | // Copyright 2016 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 netbsd openbsd |
| 6 | |
| 7 | package route |
| 8 | |
| 9 | import ( |
| 10 | "os" |
| 11 | "syscall" |
| 12 | "testing" |
| 13 | "time" |
| 14 | ) |
| 15 | |
| 16 | func TestFetchAndParseRIB(t *testing.T) { |
| 17 | for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { |
| 18 | for _, typ := range []RIBType{sysNET_RT_DUMP, sysNET_RT_IFLIST} { |
| 19 | ms, err := fetchAndParseRIB(af, typ) |
| 20 | if err != nil { |
| 21 | t.Error(err) |
| 22 | continue |
| 23 | } |
| 24 | ss, err := msgs(ms).validate() |
| 25 | if err != nil { |
| 26 | t.Errorf("%v %d %v", addrFamily(af), typ, err) |
| 27 | continue |
| 28 | } |
| 29 | for _, s := range ss { |
| 30 | t.Log(s) |
| 31 | } |
| 32 | } |
| 33 | } |
| 34 | } |
| 35 | |
| 36 | func TestMonitorAndParseRIB(t *testing.T) { |
| 37 | if testing.Short() || os.Getuid() != 0 { |
| 38 | t.Skip("must be root") |
| 39 | } |
| 40 | |
| 41 | // We suppose that using an IPv4 link-local address and the |
| 42 | // dot1Q ID for Token Ring and FDDI doesn't harm anyone. |
| 43 | pv := &propVirtual{addr: "169.254.0.1", mask: "255.255.255.0"} |
| 44 | if err := pv.configure(1002); err != nil { |
| 45 | t.Skip(err) |
| 46 | } |
| 47 | if err := pv.setup(); err != nil { |
| 48 | t.Skip(err) |
| 49 | } |
| 50 | pv.teardown() |
| 51 | |
| 52 | s, err := syscall.Socket(syscall.AF_ROUTE, syscall.SOCK_RAW, syscall.AF_UNSPEC) |
| 53 | if err != nil { |
| 54 | t.Fatal(err) |
| 55 | } |
| 56 | defer syscall.Close(s) |
| 57 | |
| 58 | go func() { |
| 59 | b := make([]byte, os.Getpagesize()) |
| 60 | for { |
| 61 | n, err := syscall.Read(s, b) |
| 62 | if err != nil { |
| 63 | return |
| 64 | } |
| 65 | ms, err := ParseRIB(0, b[:n]) |
| 66 | if err != nil { |
| 67 | t.Error(err) |
| 68 | return |
| 69 | } |
| 70 | ss, err := msgs(ms).validate() |
| 71 | if err != nil { |
| 72 | t.Error(err) |
| 73 | return |
| 74 | } |
| 75 | for _, s := range ss { |
| 76 | t.Log(s) |
| 77 | } |
| 78 | } |
| 79 | }() |
| 80 | |
| 81 | for _, vid := range []int{1002, 1003, 1004, 1005} { |
| 82 | pv := &propVirtual{addr: "169.254.0.1", mask: "255.255.255.0"} |
| 83 | if err := pv.configure(vid); err != nil { |
| 84 | t.Fatal(err) |
| 85 | } |
| 86 | if err := pv.setup(); err != nil { |
| 87 | t.Fatal(err) |
| 88 | } |
| 89 | time.Sleep(200 * time.Millisecond) |
| 90 | if err := pv.teardown(); err != nil { |
| 91 | t.Fatal(err) |
| 92 | } |
| 93 | time.Sleep(200 * time.Millisecond) |
| 94 | } |
| 95 | } |
Mikio Hara | 4d38db7 | 2016-07-20 12:23:22 +0900 | [diff] [blame] | 96 | |
| 97 | func TestParseRIBWithFuzz(t *testing.T) { |
| 98 | for _, fuzz := range []string{ |
| 99 | "0\x00\x05\x050000000000000000" + |
| 100 | "00000000000000000000" + |
| 101 | "00000000000000000000" + |
| 102 | "00000000000000000000" + |
| 103 | "0000000000000\x02000000" + |
| 104 | "00000000", |
| 105 | "\x02\x00\x05\f0000000000000000" + |
| 106 | "0\x0200000000000000", |
| 107 | "\x02\x00\x05\x100000000000000\x1200" + |
| 108 | "0\x00\xff\x00", |
| 109 | "\x02\x00\x05\f0000000000000000" + |
| 110 | "0\x12000\x00\x02\x0000", |
| 111 | "\x00\x00\x00\x01\x00", |
| 112 | "00000", |
| 113 | } { |
| 114 | for typ := RIBType(0); typ < 256; typ++ { |
| 115 | ParseRIB(typ, []byte(fuzz)) |
| 116 | } |
| 117 | } |
| 118 | } |