mirror of
https://github.com/soypat/lneto.git
synced 2026-09-02 12:59:04 +00:00
add TestRingWriteLimited
This commit is contained in:
+7
-8
@@ -32,15 +32,14 @@ func (r *Ring) WriteLimited(b []byte, limitOffset int) (int, error) {
|
|||||||
if len(b) > len(r.Buf) {
|
if len(b) > len(r.Buf) {
|
||||||
return 0, io.ErrShortBuffer
|
return 0, io.ErrShortBuffer
|
||||||
}
|
}
|
||||||
|
var limit int
|
||||||
writeEnd := (r.Off + len(b)) % len(b)
|
if limitOffset > r.End {
|
||||||
if limitOffset > r.Off && writeEnd > limitOffset {
|
limit = limitOffset - r.End
|
||||||
|
} else {
|
||||||
|
limit = len(r.Buf) - r.End + limitOffset
|
||||||
|
}
|
||||||
|
if len(b) > limit {
|
||||||
return 0, errRingBufferFull
|
return 0, errRingBufferFull
|
||||||
} else if writeEnd > len(r.Buf) {
|
|
||||||
writeEnd %= len(r.Buf)
|
|
||||||
if writeEnd > limitOffset {
|
|
||||||
return 0, errRingBufferFull
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return r.Write(b)
|
return r.Write(b)
|
||||||
}
|
}
|
||||||
|
|||||||
+41
-6
@@ -173,16 +173,51 @@ func TestRing2(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRingWriteLimited(t *testing.T) {
|
func TestRingWriteLimited(t *testing.T) {
|
||||||
rng := rand.New(rand.NewSource(0))
|
rng := rand.New(rand.NewSource(2))
|
||||||
const bufSize = 10
|
const bufSize = 8
|
||||||
r := &Ring{
|
r := &Ring{
|
||||||
Buf: make([]byte, bufSize),
|
Buf: make([]byte, bufSize),
|
||||||
}
|
}
|
||||||
var data [bufSize]byte
|
var data [bufSize]byte
|
||||||
for i := 0; i < 32; i++ {
|
var wdata [bufSize]byte
|
||||||
n, _ := rng.Read(data[:rng.Intn(10)+1])
|
for i := 0; i < 10000; i++ {
|
||||||
limoff := r.Off
|
for i := range r.Buf {
|
||||||
r.WriteLimited()
|
r.Buf[i] = 0
|
||||||
|
}
|
||||||
|
buffered, _ := rng.Read(data[:rng.Intn(bufSize-2)+1])
|
||||||
|
off := rng.Intn(bufSize)
|
||||||
|
setRingData(t, r, off, data[:buffered])
|
||||||
|
if r.Buffered() != buffered {
|
||||||
|
t.Fatalf("failed to set buffered amount of data")
|
||||||
|
} else if r.Off != off {
|
||||||
|
t.Fatal("bad offset")
|
||||||
|
}
|
||||||
|
free := r.Free()
|
||||||
|
|
||||||
|
toWrite := rng.Intn(free-1) + 1
|
||||||
|
rng.Read(wdata[:toWrite])
|
||||||
|
limOff := rng.Intn(bufSize) + 1
|
||||||
|
var wantN int
|
||||||
|
isContiguous := limOff > r.End
|
||||||
|
if isContiguous {
|
||||||
|
wantN = min(toWrite, limOff-r.End)
|
||||||
|
} else {
|
||||||
|
wantN = min(toWrite, len(r.Buf)-r.End+limOff)
|
||||||
|
}
|
||||||
|
overwrite := toWrite > wantN
|
||||||
|
n, err := r.WriteLimited(wdata[:toWrite], limOff)
|
||||||
|
if !overwrite && err != nil {
|
||||||
|
t.Errorf("limited write: %s", err)
|
||||||
|
} else if !overwrite && n != wantN {
|
||||||
|
t.Errorf("nwant=%d ngot=%d off=%d lim=%d towrite=%d buffered=%d/%d wantremain=%d gotremain=%d endOff=%d", wantN, n, off, limOff, toWrite, buffered, r.Size(), free-wantN, free-n, r.Off)
|
||||||
|
} else if overwrite && (err == nil || n != 0) {
|
||||||
|
t.Errorf("expected full buffer error and no data written on limit overwrite, got %d", n)
|
||||||
|
}
|
||||||
|
for i := r.End % r.Size(); i != limOff && i != r.Off; i = (i + 1) % r.Size() {
|
||||||
|
if r.Buf[i] != 0 {
|
||||||
|
t.Fatalf("OVERWRITE pos=%d end=%d lim=%d", i, r.End, limOff)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user