From 0668e332282a0be05a5372700dce090dfc91fdc7 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Mon, 17 Nov 2014 17:43:41 -0600 Subject: [PATCH] util/CopyExact: Test copying from interfaces and nil --- util/copy.go | 3 +++ util/copy_test.go | 25 ++++++++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/util/copy.go b/util/copy.go index 793a99cd..fda4cffc 100644 --- a/util/copy.go +++ b/util/copy.go @@ -17,6 +17,9 @@ func CopyExact(dest interface{}, src interface{}) { if sV.Kind() == reflect.String { sV = sV.Convert(reflect.SliceOf(dV.Type().Elem())) } + if !sV.IsValid() { + panic("invalid source, probably nil") + } if dV.Len() != sV.Len() { panic(fmt.Sprintf("dest len (%d) != src len (%d)", dV.Len(), sV.Len())) } diff --git a/util/copy_test.go b/util/copy_test.go index 284840a3..18c9e2d6 100644 --- a/util/copy_test.go +++ b/util/copy_test.go @@ -2,6 +2,7 @@ package util import ( "bytes" + "strings" "testing" ) @@ -51,11 +52,29 @@ func TestCopySrcString(t *testing.T) { if string(dest) != "lol" { t.FailNow() } + func() { + defer func() { + r := recover() + if r == nil { + t.FailNow() + } + }() + CopyExact(dest, "rofl") + }() + var arr [5]byte + CopyExact(&arr, interface{}("hello")) + if string(arr[:]) != "hello" { + t.FailNow() + } +} + +func TestCopySrcNilInterface(t *testing.T) { + var arr [3]byte defer func() { - r := recover() - if r == nil { + r := recover().(string) + if !strings.Contains(r, "invalid source") { t.FailNow() } }() - CopyExact(dest, "rofl") + CopyExact(&arr, nil) } -- 2.44.0