message_test.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. // +build darwin dragonfly freebsd netbsd openbsd
  5. package route
  6. import (
  7. "os"
  8. "syscall"
  9. "testing"
  10. "time"
  11. )
  12. func TestFetchAndParseRIB(t *testing.T) {
  13. for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} {
  14. for _, typ := range []RIBType{sysNET_RT_DUMP, sysNET_RT_IFLIST} {
  15. ms, err := fetchAndParseRIB(af, typ)
  16. if err != nil {
  17. t.Error(err)
  18. continue
  19. }
  20. ss, err := msgs(ms).validate()
  21. if err != nil {
  22. t.Errorf("%v %d %v", addrFamily(af), typ, err)
  23. continue
  24. }
  25. for _, s := range ss {
  26. t.Log(s)
  27. }
  28. }
  29. }
  30. }
  31. func TestMonitorAndParseRIB(t *testing.T) {
  32. if testing.Short() || os.Getuid() != 0 {
  33. t.Skip("must be root")
  34. }
  35. // We suppose that using an IPv4 link-local address and the
  36. // dot1Q ID for Token Ring and FDDI doesn't harm anyone.
  37. pv := &propVirtual{addr: "169.254.0.1", mask: "255.255.255.0"}
  38. if err := pv.configure(1002); err != nil {
  39. t.Skip(err)
  40. }
  41. if err := pv.setup(); err != nil {
  42. t.Skip(err)
  43. }
  44. pv.teardown()
  45. s, err := syscall.Socket(syscall.AF_ROUTE, syscall.SOCK_RAW, syscall.AF_UNSPEC)
  46. if err != nil {
  47. t.Fatal(err)
  48. }
  49. defer syscall.Close(s)
  50. go func() {
  51. b := make([]byte, os.Getpagesize())
  52. for {
  53. n, err := syscall.Read(s, b)
  54. if err != nil {
  55. return
  56. }
  57. ms, err := ParseRIB(0, b[:n])
  58. if err != nil {
  59. t.Error(err)
  60. return
  61. }
  62. ss, err := msgs(ms).validate()
  63. if err != nil {
  64. t.Error(err)
  65. return
  66. }
  67. for _, s := range ss {
  68. t.Log(s)
  69. }
  70. }
  71. }()
  72. for _, vid := range []int{1002, 1003, 1004, 1005} {
  73. pv := &propVirtual{addr: "169.254.0.1", mask: "255.255.255.0"}
  74. if err := pv.configure(vid); err != nil {
  75. t.Fatal(err)
  76. }
  77. if err := pv.setup(); err != nil {
  78. t.Fatal(err)
  79. }
  80. time.Sleep(200 * time.Millisecond)
  81. if err := pv.teardown(); err != nil {
  82. t.Fatal(err)
  83. }
  84. time.Sleep(200 * time.Millisecond)
  85. }
  86. }