header_test.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // Copyright 2012 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. package ipv4
  5. import (
  6. "bytes"
  7. "net"
  8. "reflect"
  9. "runtime"
  10. "strings"
  11. "testing"
  12. )
  13. var (
  14. wireHeaderFromKernel = [HeaderLen]byte{
  15. 0x45, 0x01, 0xbe, 0xef,
  16. 0xca, 0xfe, 0x45, 0xdc,
  17. 0xff, 0x01, 0xde, 0xad,
  18. 172, 16, 254, 254,
  19. 192, 168, 0, 1,
  20. }
  21. wireHeaderToKernel = [HeaderLen]byte{
  22. 0x45, 0x01, 0xbe, 0xef,
  23. 0xca, 0xfe, 0x45, 0xdc,
  24. 0xff, 0x01, 0xde, 0xad,
  25. 172, 16, 254, 254,
  26. 192, 168, 0, 1,
  27. }
  28. wireHeaderFromTradBSDKernel = [HeaderLen]byte{
  29. 0x45, 0x01, 0xdb, 0xbe,
  30. 0xca, 0xfe, 0xdc, 0x45,
  31. 0xff, 0x01, 0xde, 0xad,
  32. 172, 16, 254, 254,
  33. 192, 168, 0, 1,
  34. }
  35. wireHeaderFromFreeBSD10Kernel = [HeaderLen]byte{
  36. 0x45, 0x01, 0xef, 0xbe,
  37. 0xca, 0xfe, 0xdc, 0x45,
  38. 0xff, 0x01, 0xde, 0xad,
  39. 172, 16, 254, 254,
  40. 192, 168, 0, 1,
  41. }
  42. wireHeaderToTradBSDKernel = [HeaderLen]byte{
  43. 0x45, 0x01, 0xef, 0xbe,
  44. 0xca, 0xfe, 0xdc, 0x45,
  45. 0xff, 0x01, 0xde, 0xad,
  46. 172, 16, 254, 254,
  47. 192, 168, 0, 1,
  48. }
  49. // TODO(mikio): Add platform dependent wire header formats when
  50. // we support new platforms.
  51. testHeader = &Header{
  52. Version: Version,
  53. Len: HeaderLen,
  54. TOS: 1,
  55. TotalLen: 0xbeef,
  56. ID: 0xcafe,
  57. Flags: DontFragment,
  58. FragOff: 1500,
  59. TTL: 255,
  60. Protocol: 1,
  61. Checksum: 0xdead,
  62. Src: net.IPv4(172, 16, 254, 254),
  63. Dst: net.IPv4(192, 168, 0, 1),
  64. }
  65. )
  66. func TestMarshalHeader(t *testing.T) {
  67. b, err := testHeader.Marshal()
  68. if err != nil {
  69. t.Fatal(err)
  70. }
  71. var wh []byte
  72. switch runtime.GOOS {
  73. case "darwin", "dragonfly", "netbsd":
  74. wh = wireHeaderToTradBSDKernel[:]
  75. case "freebsd":
  76. if freebsdVersion < 1000000 {
  77. wh = wireHeaderToTradBSDKernel[:]
  78. } else {
  79. wh = wireHeaderFromFreeBSD10Kernel[:]
  80. }
  81. default:
  82. wh = wireHeaderToKernel[:]
  83. }
  84. if !bytes.Equal(b, wh) {
  85. t.Fatalf("got %#v; want %#v", b, wh)
  86. }
  87. }
  88. func TestParseHeader(t *testing.T) {
  89. var wh []byte
  90. switch runtime.GOOS {
  91. case "darwin", "dragonfly", "netbsd":
  92. wh = wireHeaderFromTradBSDKernel[:]
  93. case "freebsd":
  94. if freebsdVersion < 1000000 {
  95. wh = wireHeaderFromTradBSDKernel[:]
  96. } else {
  97. wh = wireHeaderFromFreeBSD10Kernel[:]
  98. }
  99. default:
  100. wh = wireHeaderFromKernel[:]
  101. }
  102. h, err := ParseHeader(wh)
  103. if err != nil {
  104. t.Fatal(err)
  105. }
  106. if !reflect.DeepEqual(h, testHeader) {
  107. t.Fatalf("got %#v; want %#v", h, testHeader)
  108. }
  109. s := h.String()
  110. if strings.Contains(s, ",") {
  111. t.Fatalf("should be space-separated values: %s", s)
  112. }
  113. }