dns/dnsmessage: tweak the error value on nil resource body

Change-Id: I17444d1cc3ce03b6947aaae18d4cecdf9c36193f
Reviewed-on: https://go-review.googlesource.com/47110
Reviewed-by: Ian Gudger <igudger@google.com>
Reviewed-by: Matt Layher <mdlayher@gmail.com>
Run-TryBot: Matt Layher <mdlayher@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/dns/dnsmessage/message.go b/dns/dnsmessage/message.go
index 3826c62..19b260d 100644
--- a/dns/dnsmessage/message.go
+++ b/dns/dnsmessage/message.go
@@ -80,6 +80,7 @@
 	errReserved           = errors.New("segment prefix is reserved")
 	errTooManyPtr         = errors.New("too many pointers (>10)")
 	errInvalidPtr         = errors.New("invalid pointer")
+	errNilResouceBody     = errors.New("nil resource body")
 	errResourceLen        = errors.New("insufficient data for resource body length")
 	errSegTooLong         = errors.New("segment length too long")
 	errZeroSegLen         = errors.New("zero length segment")
@@ -281,7 +282,7 @@
 
 func (r *Resource) pack(msg []byte, compression map[string]int) ([]byte, error) {
 	if r.Body == nil {
-		return msg, &nestedError{"Resource", errors.New("nil resource body")}
+		return msg, errNilResouceBody
 	}
 	oldMsg := msg
 	r.Header.Type = r.Body.realType()
diff --git a/dns/dnsmessage/message_test.go b/dns/dnsmessage/message_test.go
index 2b2c8f1..0f98daa 100644
--- a/dns/dnsmessage/message_test.go
+++ b/dns/dnsmessage/message_test.go
@@ -535,40 +535,57 @@
 }
 
 func TestResourcePack(t *testing.T) {
-	for _, m := range []Message{
+	for _, tt := range []struct {
+		m   Message
+		err error
+	}{
 		{
-			Questions: []Question{
-				{
-					Name:  mustNewName("."),
-					Type:  TypeAAAA,
-					Class: ClassINET,
+			Message{
+				Questions: []Question{
+					{
+						Name:  mustNewName("."),
+						Type:  TypeAAAA,
+						Class: ClassINET,
+					},
 				},
+				Answers: []Resource{{ResourceHeader{}, nil}},
 			},
-			Answers: []Resource{{ResourceHeader{}, nil}},
+			&nestedError{"packing Answer", errNilResouceBody},
 		},
 		{
-			Questions: []Question{
-				{
-					Name:  mustNewName("."),
-					Type:  TypeAAAA,
-					Class: ClassINET,
+			Message{
+				Questions: []Question{
+					{
+						Name:  mustNewName("."),
+						Type:  TypeAAAA,
+						Class: ClassINET,
+					},
+				},
+				Authorities: []Resource{{ResourceHeader{}, (*NSResource)(nil)}},
+			},
+			&nestedError{"packing Authority",
+				&nestedError{"ResourceHeader",
+					&nestedError{"Name", errNonCanonicalName},
 				},
 			},
-			Authorities: []Resource{{ResourceHeader{}, (*NSResource)(nil)}},
 		},
 		{
-			Questions: []Question{
-				{
-					Name:  mustNewName("."),
-					Type:  TypeA,
-					Class: ClassINET,
+			Message{
+				Questions: []Question{
+					{
+						Name:  mustNewName("."),
+						Type:  TypeA,
+						Class: ClassINET,
+					},
 				},
+				Additionals: []Resource{{ResourceHeader{}, nil}},
 			},
-			Additionals: []Resource{{ResourceHeader{}, nil}},
+			&nestedError{"packing Additional", errNilResouceBody},
 		},
 	} {
-		if _, err := m.Pack(); err == nil {
-			t.Errorf("should fail: %v", m)
+		_, err := tt.m.Pack()
+		if !reflect.DeepEqual(err, tt.err) {
+			t.Errorf("got %v for %v; want %v", err, tt.m, tt.err)
 		}
 	}
 }