1
0
Fork 0

Adding upstream version 1.2.0.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-05-18 16:42:16 +02:00
parent 6a5b4a9666
commit 82a6c39bcf
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
24 changed files with 2727 additions and 0 deletions

31
limio/limit.go Normal file
View file

@ -0,0 +1,31 @@
package limio
import "io"
type limitedWriter struct {
W io.Writer
N int64
}
func (l *limitedWriter) Write(p []byte) (n int, err error) {
if l.N <= 0 {
return 0, io.ErrShortWrite
}
if int64(len(p)) > l.N {
p = p[0:l.N]
err = io.ErrShortWrite
}
n, er := l.W.Write(p)
if er != nil {
err = er
}
l.N -= int64(n)
return n, err
}
// LimitWriter works like io.LimitReader. It writes at most n bytes
// to the underlying Writer. It returns io.ErrShortWrite if more than n
// bytes are attempted to be written.
func LimitWriter(w io.Writer, n int64) io.Writer {
return &limitedWriter{W: w, N: n}
}

62
limio/limit_test.go Normal file
View file

@ -0,0 +1,62 @@
package limio
import (
"bytes"
"crypto/rand"
"io"
"testing"
)
func TestLimits(t *testing.T) {
LimitTestN(0, t)
LimitTestN(1, t)
LimitTestN(2, t)
LimitTestN(1024, t)
OverLimitTestN(0, t)
OverLimitTestN(1, t)
OverLimitTestN(2, t)
OverLimitTestN(1024, t)
}
func OverLimitTestN(N int64, t *testing.T) {
got := bytes.NewBuffer(nil)
exp := bytes.NewBuffer(nil)
lw := LimitWriter(got, N)
w := io.MultiWriter(exp, lw)
_, err := io.CopyN(w, rand.Reader, 2*N)
if err != io.ErrShortWrite && N != 2*N {
t.Error("did not throw io.ErrShortWrite!")
if err != nil {
t.Error(err.Error())
}
}
if !bytes.Equal(got.Bytes(), exp.Bytes()[:N]) {
t.Errorf("Exp: %s\n Got: %s\n",
string(exp.Bytes()[:N]),
string(got.Bytes()))
}
if int64(got.Len()) != N {
t.Errorf("LimitWriter did not cap at %d", N)
}
}
func LimitTestN(N int64, t *testing.T) {
got := bytes.NewBuffer(nil)
exp := bytes.NewBuffer(nil)
lw := LimitWriter(got, N)
w := io.MultiWriter(lw, exp)
io.CopyN(w, rand.Reader, N)
if !bytes.Equal(got.Bytes(), exp.Bytes()) {
t.Errorf("Exp: %s\n Got: %s\n",
string(exp.Bytes()[:N]),
string(got.Bytes()))
}
}