header_test.go 3.1 KB

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