...
1
2
3
4 package packet
5
6 import (
7 "encoding/binary"
8 "fmt"
9 "math"
10 "testing"
11
12 "github.com/google/go-cmp/cmp"
13 "github.com/josharian/native"
14 )
15
16 func Test_htons(t *testing.T) {
17 tests := []struct {
18 name string
19 i int
20 vLE, vBE uint16
21 ok bool
22 }{
23 {
24 name: "negative",
25 i: -1,
26 },
27 {
28 name: "too large",
29 i: math.MaxUint16 + 1,
30 },
31 {
32 name: "IPv4",
33 i: 0x0800,
34 vLE: 0x0008,
35 vBE: 0x0800,
36 ok: true,
37 },
38 {
39 name: "IPv6",
40 i: 0x86dd,
41 vLE: 0xdd86,
42 vBE: 0x86dd,
43 ok: true,
44 },
45 }
46
47 for _, tt := range tests {
48 t.Run(tt.name, func(t *testing.T) {
49 v, err := htons(tt.i)
50 if tt.ok && err != nil {
51 t.Fatalf("failed to perform htons: %v", err)
52 }
53 if !tt.ok && err == nil {
54 t.Fatal("expected an error, but none occurred")
55 }
56 if err != nil {
57 t.Logf("err: %v", err)
58 return
59 }
60
61
62 var want uint16
63 if native.Endian == binary.ByteOrder(binary.LittleEndian) {
64 want = tt.vLE
65 } else {
66 want = tt.vBE
67 }
68
69 if diff := cmp.Diff(hex(want), hex(v)); diff != "" {
70 t.Fatalf("unexpected output for %s GOARCH (-want +got):\n%s", native.Endian.String(), diff)
71 }
72 })
73 }
74 }
75
76 func hex(v uint16) string {
77 return fmt.Sprintf("%#04x", v)
78 }
79
View as plain text