diff options
author | Chris Koch <chrisko@google.com> | 2023-02-25 19:49:41 -0800 |
---|---|---|
committer | Chris K <c@chrisko.ch> | 2023-02-27 10:35:19 -0800 |
commit | f23baa7a2abafc3c3dc9b5c040cd68327f269b2b (patch) | |
tree | 75fa001f199ac702fa25fdab8013bef634dc3c3d /dhcpv6 | |
parent | c063ce388b0632ce267a0ff9af24e186504ebcaa (diff) |
IANA: tests for FromBytes, ToBytes, and IANA Getter
Signed-off-by: Chris Koch <chrisko@google.com>
Diffstat (limited to 'dhcpv6')
-rw-r--r-- | dhcpv6/option_nontemporaryaddress_test.go | 228 |
1 files changed, 146 insertions, 82 deletions
diff --git a/dhcpv6/option_nontemporaryaddress_test.go b/dhcpv6/option_nontemporaryaddress_test.go index 3e5c55b..d464771 100644 --- a/dhcpv6/option_nontemporaryaddress_test.go +++ b/dhcpv6/option_nontemporaryaddress_test.go @@ -1,78 +1,158 @@ package dhcpv6 import ( + "errors" + "fmt" "net" "reflect" "testing" "time" + "github.com/google/go-cmp/cmp" "github.com/stretchr/testify/require" + "github.com/u-root/uio/uio" ) -func TestParseMessageWithIANA(t *testing.T) { - data := []byte{ - 0, 3, // IANA option code - 0, 40, // length - 1, 0, 0, 0, // IAID - 0, 0, 0, 1, // T1 - 0, 0, 0, 2, // T2 - 0, 5, 0, 0x18, 0x24, 1, 0xdb, 0, 0x30, 0x10, 0xc0, 0x8f, 0xfa, 0xce, 0, 0, 0, 0x44, 0, 0, 0, 0, 0, 2, 0, 0, 0, 4, // options - } - var got MessageOptions - if err := got.FromBytes(data); err != nil { - t.Errorf("FromBytes = %v", err) - } - - want := &OptIANA{ - IaId: [4]byte{1, 0, 0, 0}, - T1: 1 * time.Second, - T2: 2 * time.Second, - Options: IdentityOptions{Options: Options{&OptIAAddress{ - IPv6Addr: net.IP{0x24, 1, 0xdb, 0, 0x30, 0x10, 0xc0, 0x8f, 0xfa, 0xce, 0, 0, 0, 0x44, 0, 0}, - PreferredLifetime: 2 * time.Second, - ValidLifetime: 4 * time.Second, - Options: AddressOptions{Options: Options{}}, - }}}, - } - if gotIANA := got.OneIANA(); !reflect.DeepEqual(gotIANA, want) { - t.Errorf("OneIANA = %v, want %v", gotIANA, want) - } -} - -func TestOptIANAParseOptIANA(t *testing.T) { - data := []byte{ - 1, 0, 0, 0, // IAID - 0, 0, 0, 1, // T1 - 0, 0, 0, 2, // T2 - 0, 5, 0, 0x18, 0x24, 1, 0xdb, 0, 0x30, 0x10, 0xc0, 0x8f, 0xfa, 0xce, 0, 0, 0, 0x44, 0, 0, 0, 0, 0xb2, 0x7a, 0, 0, 0xc0, 0x8a, // options - } - var opt OptIANA - err := opt.FromBytes(data) - require.NoError(t, err) - require.Equal(t, OptionIANA, opt.Code()) -} - -func TestOptIANAParseOptIANAInvalidLength(t *testing.T) { - data := []byte{ - 1, 0, 0, 0, // IAID - 0, 0, 0, 1, // T1 - // truncated from here +func TestIANAParseAndGetter(t *testing.T) { + for i, tt := range []struct { + buf []byte + err error + want []*OptIANA + }{ + { + buf: []byte{ + 0, 3, // IANA option code + 0, 40, // length + 1, 0, 0, 0, // IAID + 0, 0, 0, 1, // T1 + 0, 0, 0, 2, // T2 + 0, 5, 0, 0x18, 0x24, 1, 0xdb, 0, 0x30, 0x10, 0xc0, 0x8f, 0xfa, 0xce, 0, 0, 0, 0x44, 0, 0, // IPv6 + 0, 0, 0, 2, // PreferredLifetime + 0, 0, 0, 4, // ValidLifetime + }, + want: []*OptIANA{ + &OptIANA{ + IaId: [4]byte{1, 0, 0, 0}, + T1: 1 * time.Second, + T2: 2 * time.Second, + Options: IdentityOptions{Options: Options{&OptIAAddress{ + IPv6Addr: net.IP{0x24, 1, 0xdb, 0, 0x30, 0x10, 0xc0, 0x8f, 0xfa, 0xce, 0, 0, 0, 0x44, 0, 0}, + PreferredLifetime: 2 * time.Second, + ValidLifetime: 4 * time.Second, + Options: AddressOptions{Options: Options{}}, + }}}, + }, + }, + }, + { + buf: []byte{ + 0, 3, // IANA option code + 0, 40, // length + 1, 0, 0, 0, // IAID + 0, 0, 0, 1, // T1 + 0, 0, 0, 2, // T2 + 0, 5, 0, 0x18, 0x24, 1, 0xdb, 0, 0x30, 0x10, 0xc0, 0x8f, 0xfa, 0xce, 0, 0, 0, 0x44, 0, 0, // IPv6 + 0, 0, 0, 2, // PreferredLifetime + 0, 0, 0, 4, // ValidLifetime + + 0, 3, // IANA option code + 0, 40, // length + 1, 2, 3, 4, // IAID + 0, 0, 0, 9, // T1 + 0, 0, 0, 8, // T2 + 0, 5, 0, 0x18, 0x24, 1, 0xdb, 0, 0x30, 0x10, 0xc0, 0x8f, 0xfa, 0xce, 0, 0, 0, 0x44, 0, 0, // IPv6 + 0, 0, 0, 2, // PreferredLifetime + 0, 0, 0, 4, // ValidLifetime + }, + want: []*OptIANA{ + &OptIANA{ + IaId: [4]byte{1, 0, 0, 0}, + T1: 1 * time.Second, + T2: 2 * time.Second, + Options: IdentityOptions{Options: Options{&OptIAAddress{ + IPv6Addr: net.IP{0x24, 1, 0xdb, 0, 0x30, 0x10, 0xc0, 0x8f, 0xfa, 0xce, 0, 0, 0, 0x44, 0, 0}, + PreferredLifetime: 2 * time.Second, + ValidLifetime: 4 * time.Second, + Options: AddressOptions{Options: Options{}}, + }}}, + }, + &OptIANA{ + IaId: [4]byte{1, 2, 3, 4}, + T1: 9 * time.Second, + T2: 8 * time.Second, + Options: IdentityOptions{Options: Options{&OptIAAddress{ + IPv6Addr: net.IP{0x24, 1, 0xdb, 0, 0x30, 0x10, 0xc0, 0x8f, 0xfa, 0xce, 0, 0, 0, 0x44, 0, 0}, + PreferredLifetime: 2 * time.Second, + ValidLifetime: 4 * time.Second, + Options: AddressOptions{Options: Options{}}, + }}}, + }, + }, + }, + + { + buf: nil, + want: nil, + }, + { + buf: []byte{0, 3, 0, 1, 0}, + want: nil, + err: uio.ErrBufferTooShort, + }, + { + buf: []byte{ + 0, 3, // IANA option code + 0, 8, // length + 1, 0, 0, 0, // IAID + 0, 0, 0, 1, // T1 + // truncated from here + }, + want: nil, + err: uio.ErrBufferTooShort, + }, + { + buf: []byte{ + 0, 3, // IANA option code + 0, 36, // length + 1, 0, 0, 0, // IAID + 0, 0, 0, 1, // T1 + 0, 0, 0, 2, // T2 + 0, 5, 0, 0x18, 0x24, 1, 0xdb, 0, 0x30, 0x10, 0xc0, 0x8f, 0xfa, 0xce, 0, 0, 0, 0x44, 0, 0, // IPv6 + 0, 0, 0xb2, 0x7a, // PreferredLifetime + // Missing ValidLifetime + }, + want: nil, + err: uio.ErrBufferTooShort, + }, + } { + t.Run(fmt.Sprintf("%d", i), func(t *testing.T) { + var mo MessageOptions + if err := mo.FromBytes(tt.buf); !errors.Is(err, tt.err) { + t.Errorf("FromBytes = %v, want %v", err, tt.err) + } + if got := mo.IANA(); !reflect.DeepEqual(got, tt.want) { + t.Errorf("IANA = %v, want %v", got, tt.want) + } + var wantOne *OptIANA + if len(tt.want) >= 1 { + wantOne = tt.want[0] + } + if got := mo.OneIANA(); !reflect.DeepEqual(got, wantOne) { + t.Errorf("OneIANA = %v, want %v", got, wantOne) + } + + if len(tt.want) >= 1 { + var b MessageOptions + for _, iana := range tt.want { + b.Add(iana) + } + got := b.ToBytes() + if diff := cmp.Diff(tt.buf, got); diff != "" { + t.Errorf("ToBytes mismatch (-want, +got): %s", diff) + } + } + }) } - var opt OptIANA - err := opt.FromBytes(data) - require.Error(t, err) -} - -func TestOptIANAParseOptIANAInvalidOptions(t *testing.T) { - data := []byte{ - 1, 0, 0, 0, // IAID - 0, 0, 0, 1, // T1 - 0, 0, 0, 2, // T2 - 0, 5, 0, 0x18, 0x24, 1, 0xdb, 0, 0x30, 0x10, 0xc0, 0x8f, 0xfa, 0xce, 0, 0, 0, 0x44, 0, 0, 0, 0, 0xb2, 0x7a, // truncated options - } - var opt OptIANA - err := opt.FromBytes(data) - require.Error(t, err) } func TestOptIANAGetOneOption(t *testing.T) { @@ -127,30 +207,14 @@ func TestOptIANADelOption(t *testing.T) { require.Equal(t, iana2.Options.Options, Options{&optsc}) } -func TestOptIANAToBytes(t *testing.T) { - opt := OptIANA{ - IaId: [4]byte{1, 2, 3, 4}, - T1: 12345 * time.Second, - T2: 54321 * time.Second, - Options: IdentityOptions{[]Option{ - OptElapsedTime(10 * time.Millisecond), - }}, - } - expected := []byte{ - 1, 2, 3, 4, // IA ID - 0, 0, 0x30, 0x39, // T1 = 12345 - 0, 0, 0xd4, 0x31, // T2 = 54321 - 0, 8, 0, 2, 0x00, 0x01, - } - require.Equal(t, expected, opt.ToBytes()) -} - func TestOptIANAString(t *testing.T) { data := []byte{ 1, 0, 0, 0, // IAID 0, 0, 0, 1, // T1 0, 0, 0, 2, // T2 - 0, 5, 0, 0x18, 0x24, 1, 0xdb, 0, 0x30, 0x10, 0xc0, 0x8f, 0xfa, 0xce, 0, 0, 0, 0x44, 0, 0, 0, 0, 0xb2, 0x7a, 0, 0, 0xc0, 0x8a, // options + 0, 5, 0, 0x18, 0x24, 1, 0xdb, 0, 0x30, 0x10, 0xc0, 0x8f, 0xfa, 0xce, 0, 0, 0, 0x44, 0, 0, // IPv6 + 0, 0, 0xb2, 0x7a, // PreferredLifetime + 0, 0, 0xc0, 0x8a, // ValidLifetime } var opt OptIANA err := opt.FromBytes(data) |