diff --git a/dhcp/options.go b/dhcp/options.go index 85c249f..87c92a1 100644 --- a/dhcp/options.go +++ b/dhcp/options.go @@ -72,6 +72,15 @@ func (o Options) MarshalTo(w io.Writer) error { return nil } +// Copy returns a shallow copy of o. +func (o Options) Copy() Options { + ret := make(Options, len(o)) + for k, v := range o { + ret[k] = v + } + return ret +} + // marshalLimited serializes o into w. If nBytes > 0, as many options // as possible are packed into that many bytes, inserting padding as // needed, and the remaining unwritten options are returned. diff --git a/dhcp/options_test.go b/dhcp/options_test.go new file mode 100644 index 0000000..1483dd8 --- /dev/null +++ b/dhcp/options_test.go @@ -0,0 +1,46 @@ +package dhcp + +import "testing" + +func TestOptionReading(t *testing.T) { + o := Options{ + 1: []byte{1, 2, 3}, + 2: []byte{3}, + 3: []byte{0, 1}, + } + + b, ok := o.Byte(2) + if !ok { + t.Fatalf("Option 2 should be a valid byte") + } + if b != 3 { + t.Fatalf("Wanted value 3 for option 2, got %d", b) + } + + b, ok = o.Byte(3) + if ok { + t.Fatalf("Option 3 shouldn't be a valid byte") + } + + u, ok := o.Uint16(3) + if !ok { + t.Fatalf("Option 3 should be a valid byte") + } + if u != 1 { + t.Fatalf("Wanted value 1 for option 3, got %d", u) + } +} + +func TestCopy(t *testing.T) { + o := Options{ + 1: []byte{2}, + 2: []byte{3, 4}, + } + + o2 := o.Copy() + delete(o2, 2) + + if len(o) != 2 { + t.Fatalf("Mutating Option copy mutated the original") + } +}