...
1 package ringbuf
2
3 import (
4 "bytes"
5 "io"
6 "testing"
7 )
8
9 func TestRingBufferReader(t *testing.T) {
10 buf := make([]byte, 2)
11
12 ring := makeRing(2, 0)
13 n, err := ring.Read(buf)
14 if err != io.EOF {
15 t.Error("Expected io.EOF, got", err)
16 }
17 if n != 2 {
18 t.Errorf("Expected to read 2 bytes, got %d", n)
19 }
20 if !bytes.Equal(buf, []byte{0, 1}) {
21 t.Error("Expected [0, 1], got", buf)
22 }
23 n, err = ring.Read(buf)
24 if err != io.EOF {
25 t.Error("Expected io.EOF, got", err)
26 }
27 if n != 0 {
28 t.Error("Expected to read 0 bytes, got", n)
29 }
30
31 buf = make([]byte, 4)
32
33 ring = makeRing(4, 4)
34 n, err = io.ReadFull(ring, buf)
35 if err != nil {
36 t.Error("Expected nil, got", err)
37 }
38 if n != 4 {
39 t.Errorf("Expected to read 4 bytes, got %d", n)
40 }
41 if !bytes.Equal(buf, []byte{0, 1, 2, 3}) {
42 t.Error("Expected [0, 1, 2, 3], got", buf)
43 }
44 n, err = ring.Read(buf)
45 if err != io.EOF {
46 t.Error("Expected io.EOF, got", err)
47 }
48 if n != 0 {
49 t.Error("Expected to read 0 bytes, got", n)
50 }
51 }
52
53 func makeRing(size, offset int) *ringReader {
54 if size != 0 && (size&(size-1)) != 0 {
55 panic("size must be power of two")
56 }
57
58 ring := make([]byte, 2*size)
59 for i := range ring {
60 ring[i] = byte(i)
61 }
62
63 consumer := uint64(offset)
64 producer := uint64(len(ring)/2 + offset)
65
66 return newRingReader(&consumer, &producer, ring)
67 }
68
View as plain text