dns/dnsmessage: add fuzz test

After CL 443215 pack(unpack(msg)) should never fail,
so we can add a fuzz test to prove that.

Change-Id: Ia2abfc30e2b2a492b4dd5de6ca6f29d2324bd737
GitHub-Last-Rev: 1d9812a34c3295730951535bd79917f5bb2c187e
GitHub-Pull-Request: golang/net#177
Reviewed-on: https://go-review.googlesource.com/c/net/+/500296
Auto-Submit: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Joedian Reid <joedian@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Mateusz Poliwczak <mpoliwczak34@gmail.com>
diff --git a/dns/dnsmessage/message_test.go b/dns/dnsmessage/message_test.go
index ce2716e..64c6db8 100644
--- a/dns/dnsmessage/message_test.go
+++ b/dns/dnsmessage/message_test.go
@@ -1643,3 +1643,31 @@
 		}
 	}
 }
+
+func FuzzUnpackPack(f *testing.F) {
+	for _, msg := range []Message{smallTestMsg(), largeTestMsg()} {
+		bytes, _ := msg.Pack()
+		f.Add(bytes)
+	}
+
+	f.Fuzz(func(t *testing.T, msg []byte) {
+		var m Message
+		if err := m.Unpack(msg); err != nil {
+			return
+		}
+
+		msgPacked, err := m.Pack()
+		if err != nil {
+			t.Fatalf("failed to pack message that was succesfully unpacked: %v", err)
+		}
+
+		var m2 Message
+		if err := m2.Unpack(msgPacked); err != nil {
+			t.Fatalf("failed to unpack message that was succesfully packed: %v", err)
+		}
+
+		if !reflect.DeepEqual(m, m2) {
+			t.Fatal("unpack(msg) is not deep equal to unpack(pack(unpack(msg)))")
+		}
+	})
+}