From f5806bc01c49ab9ed8b239419be48df54a08eaa0 Mon Sep 17 00:00:00 2001
From: Jack Christensen <jack@jackchristensen.com>
Date: Mon, 24 Jan 2022 08:10:01 -0600
Subject: [PATCH] Add a fuzz test

Investigating https://github.com/jackc/pgx/issues/938.
---
 chunkreader_test.go | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/chunkreader_test.go b/chunkreader_test.go
index 67a20af2..ddc2fbf6 100644
--- a/chunkreader_test.go
+++ b/chunkreader_test.go
@@ -2,6 +2,7 @@ package chunkreader
 
 import (
 	"bytes"
+	"math/rand"
 	"testing"
 )
 
@@ -94,3 +95,34 @@ func TestChunkReaderDoesNotReuseBuf(t *testing.T) {
 		t.Fatalf("Expected KeepLast to prevent Next from overwriting buf, expected %v but it was %v", src[0:4], n1)
 	}
 }
+
+type randomReader struct {
+	rnd *rand.Rand
+}
+
+// Read reads a random number of random bytes.
+func (r *randomReader) Read(p []byte) (n int, err error) {
+	n = r.rnd.Intn(len(p) + 1)
+	return r.rnd.Read(p[:n])
+}
+
+func TestChunkReaderNextFuzz(t *testing.T) {
+	rr := &randomReader{rnd: rand.New(rand.NewSource(1))}
+	r, err := NewConfig(rr, Config{MinBufLen: 8192})
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	randomSizes := rand.New(rand.NewSource(0))
+
+	for i := 0; i < 100000; i++ {
+		size := randomSizes.Intn(16384) + 1
+		buf, err := r.Next(size)
+		if err != nil {
+			t.Fatal(err)
+		}
+		if len(buf) != size {
+			t.Fatalf("Expected to get %v bytes but got %v bytes", size, len(buf))
+		}
+	}
+}