message_test.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. }
  87. func TestParseRIBWithFuzz(t *testing.T) {
  88. for _, fuzz := range []string{
  89. "0\x00\x05\x050000000000000000" +
  90. "00000000000000000000" +
  91. "00000000000000000000" +
  92. "00000000000000000000" +
  93. "0000000000000\x02000000" +
  94. "00000000",
  95. "\x02\x00\x05\f0000000000000000" +
  96. "0\x0200000000000000",
  97. "\x02\x00\x05\x100000000000000\x1200" +
  98. "0\x00\xff\x00",
  99. "\x02\x00\x05\f0000000000000000" +
  100. "0\x12000\x00\x02\x0000",
  101. "\x00\x00\x00\x01\x00",
  102. "00000",
  103. } {
  104. for typ := RIBType(0); typ < 256; typ++ {
  105. ParseRIB(typ, []byte(fuzz))
  106. }
  107. }
  108. }