aboutsummaryrefslogtreecommitdiff
path: root/internal/iolimit/expect_length_reader_test.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-02-21 18:11:49 +0800
committerGravatar Runxi Yu2026-02-21 18:11:49 +0800
commit83c03b605df05ee4c3b60f1aea0411a0636ca0b5 (patch)
tree9cb853d3ef94f08d10e8704a5eb1413b5eb55796 /internal/iolimit/expect_length_reader_test.go
parentobjectstore/loose, repository: Use a Reader-based API (diff)
signatureNo signature
iolimit: Add ExpectLengthReader
Diffstat (limited to 'internal/iolimit/expect_length_reader_test.go')
-rw-r--r--internal/iolimit/expect_length_reader_test.go70
1 files changed, 70 insertions, 0 deletions
diff --git a/internal/iolimit/expect_length_reader_test.go b/internal/iolimit/expect_length_reader_test.go
new file mode 100644
index 00000000..503c88ed
--- /dev/null
+++ b/internal/iolimit/expect_length_reader_test.go
@@ -0,0 +1,70 @@
+package iolimit_test
+
+import (
+ "bytes"
+ "errors"
+ "io"
+ "testing"
+
+ "codeberg.org/lindenii/furgit/internal/iolimit"
+)
+
+func TestExpectLengthReaderExact(t *testing.T) {
+ t.Parallel()
+
+ r := iolimit.ExpectLengthReader(bytes.NewReader([]byte("hello")), 5)
+ got, err := io.ReadAll(r)
+ if err != nil {
+ t.Fatalf("ReadAll error: %v", err)
+ }
+ if !bytes.Equal(got, []byte("hello")) {
+ t.Fatalf("ReadAll = %q, want %q", got, "hello")
+ }
+
+ buf := make([]byte, 1)
+ n, err := r.Read(buf)
+ if n != 0 || !errors.Is(err, io.EOF) {
+ t.Fatalf("post-boundary Read = (%d,%v), want (0,EOF)", n, err)
+ }
+}
+
+func TestExpectLengthReaderShort(t *testing.T) {
+ t.Parallel()
+
+ r := iolimit.ExpectLengthReader(bytes.NewReader([]byte("hey")), 5)
+ _, err := io.ReadAll(r)
+ if !errors.Is(err, io.ErrUnexpectedEOF) {
+ t.Fatalf("ReadAll error = %v, want ErrUnexpectedEOF", err)
+ }
+}
+
+func TestExpectLengthReaderLongDetectedOnNextRead(t *testing.T) {
+ t.Parallel()
+
+ r := iolimit.ExpectLengthReader(bytes.NewReader([]byte("hello!")), 5)
+ buf := make([]byte, 5)
+ n, err := io.ReadFull(r, buf)
+ if err != nil {
+ t.Fatalf("ReadFull error: %v", err)
+ }
+ if n != 5 || !bytes.Equal(buf, []byte("hello")) {
+ t.Fatalf("ReadFull = (%d,%q), want (5,hello)", n, buf)
+ }
+
+ probe := make([]byte, 1)
+ n, err = r.Read(probe)
+ if n != 0 || !errors.Is(err, iolimit.ErrExpectedLengthExceeded) {
+ t.Fatalf("overflow Read = (%d,%v), want (0,ErrExpectedLengthExceeded)", n, err)
+ }
+}
+
+func TestExpectLengthReaderEmptyExpected(t *testing.T) {
+ t.Parallel()
+
+ r := iolimit.ExpectLengthReader(bytes.NewReader(nil), 0)
+ buf := make([]byte, 1)
+ n, err := r.Read(buf)
+ if n != 0 || !errors.Is(err, io.EOF) {
+ t.Fatalf("Read = (%d,%v), want (0,EOF)", n, err)
+ }
+}