diff options
Diffstat (limited to 'dhcpv6')
-rw-r--r-- | dhcpv6/option_relaymsg_test.go | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/dhcpv6/option_relaymsg_test.go b/dhcpv6/option_relaymsg_test.go index 95fb9fb..93bab2f 100644 --- a/dhcpv6/option_relaymsg_test.go +++ b/dhcpv6/option_relaymsg_test.go @@ -1,6 +1,7 @@ package dhcpv6 import ( + "reflect" "testing" ) @@ -45,3 +46,73 @@ func TestRelayMsgOptionsFromBytes(t *testing.T) { ) } } + +func TestRelayMsgParseOptRelayMsgSingleEncapsulation(t *testing.T) { + d, err := FromBytes([]byte{ + 12, // RELAY-FORW + 0, // hop count + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // linkAddr + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, // peerAddr + 0, 9, // option: relay message + 0, 10, // relayed message length + 1, // SOLICIT + 0xaa, 0xbb, 0xcc, // transaction ID + 0, 8, // option: elapsed time + 0, 2, // option length + 0x11, 0x22, // option value + }) + if err != nil { + t.Fatal(err) + } + r, ok := d.(*DHCPv6Relay) + if !ok { + t.Fatalf("Invalid DHCPv6 type. Expected DHCPv6Relay, got %v", + reflect.TypeOf(d), + ) + } + if mType := r.Type(); mType != RELAY_FORW { + t.Fatalf("Invalid messge type for relay. Expected %v, got %v", RELAY_FORW, mType) + } + if len(r.options) != 1 { + t.Fatalf("Invalid number of options. Expected 1, got %v", len(r.options)) + } + if code := r.options[0].Code(); code != OPTION_RELAY_MSG { + t.Fatalf("Invalid option code. Expected OPTION_RELAY_MSG (%v), got %v", + OPTION_RELAY_MSG, code, + ) + } + opt := r.options[0] + ro, ok := opt.(*OptRelayMsg) + if !ok { + t.Fatalf("Invalid option type. Expected OptRelayMsg, got %v", + reflect.TypeOf(ro), + ) + } + innerDHCP, ok := ro.RelayMessage().(*DHCPv6Message) + if !ok { + t.Fatalf("Invalid relay message type. Expected DHCPv6Message, got %v", + reflect.TypeOf(innerDHCP), + ) + } + if dType := innerDHCP.Type(); dType != SOLICIT { + t.Fatal("Invalid inner DHCP type. Expected SOLICIT (%v), got %v", + SOLICIT, dType, + ) + } + if tID := innerDHCP.TransactionID(); tID != 0xaabbcc { + t.Fatal("Invalid inner DHCP transaction ID. Expected 0xaabbcc, got %v", tID) + } + if len(innerDHCP.options) != 1 { + t.Fatal("Invalid inner DHCP options length. Expected 1, got %v", len(innerDHCP.options)) + } + innerOpt := innerDHCP.options[0] + eto, ok := innerOpt.(*OptElapsedTime) + if !ok { + t.Fatal("Invalid inner option type. Expected OptElapsedTime, got %v", + reflect.TypeOf(innerOpt), + ) + } + if eTime := eto.ElapsedTime(); eTime != 0x1122 { + t.Fatal("Invalid elapsed time. Expected 0x1122, got 0x%04x", eTime) + } +} |