-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcounting_buffer_test.go
101 lines (81 loc) · 2.27 KB
/
counting_buffer_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package main
import (
"bytes"
"log"
"os/exec"
"runtime"
"sync"
"testing"
"github.com/bmizerany/assert"
)
func TestCounting(t *testing.T) {
cb := NewCountingBuffer()
cb.Write([]byte(""))
assert.Equal(t, uint64(0), cb.TotalIn())
cb.Write([]byte("hi"))
assert.Equal(t, uint64(2), cb.TotalIn())
cb.Write([]byte("hello"))
assert.Equal(t, uint64(7), cb.TotalIn())
cb.ClearCount()
assert.Equal(t, uint64(0), cb.TotalIn())
cb.WriteString("hi2")
assert.Equal(t, uint64(3), cb.TotalIn())
cb.WriteString("hello2")
assert.Equal(t, uint64(9), cb.TotalIn())
}
// you _should_ be able to make this fail by commenting out the mutex lock/unlock in totalInSafeInc
func TestSimulCounting(t *testing.T) {
oldgmp := runtime.GOMAXPROCS(runtime.NumCPU() * 2)
defer runtime.GOMAXPROCS(oldgmp)
cb := NewCountingBuffer()
var wg sync.WaitGroup
for i := 0; i < 10000; i++ {
wg.Add(1)
go func() {
cb.WriteString("1234567")
wg.Done()
}()
}
wg.Wait()
assert.Equal(t, uint64(70000), cb.TotalIn())
}
func TestReadFrom(t *testing.T) {
buf := bytes.NewReader([]byte("Hello"))
cb := NewCountingBuffer()
n, err := cb.ReadFrom(buf)
assert.Equal(t, nil, err, 12339872388)
assert.Equal(t, int64(5), n, 12339872389)
}
func TestReadFromStdOut(t *testing.T) {
cmd := exec.Command("sh", "-c", "echo abc && sleep 0.15 && echo d")
cberr := NewCountingBuffer()
cbout := NewCountingBuffer()
cmd.Stderr = cberr
cmd.Stdout = cbout
err := cmd.Run()
assert.Equal(t, nil, err, 948027283)
if err != nil {
log.Println(err)
}
assert.Equal(t, uint64(0), cberr.TotalIn())
assert.Equal(t, uint64(6), cbout.TotalIn())
}
func TestLongRead(t *testing.T) {
long := "echo abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz && sleep 0.04 && "
for i := 0; i < 4; i++ {
long = long + long
}
long = long + "echo done"
cmd := exec.Command("sh", "-c", long)
cberr := NewCountingBuffer()
cbout := NewCountingBuffer()
cmd.Stderr = cberr
cmd.Stdout = cbout
err := cmd.Run()
assert.Equal(t, nil, err, 948027283)
if err != nil {
log.Println(err)
}
assert.Equal(t, uint64(0), cberr.TotalIn())
assert.Equal(t, uint64(3349), cbout.TotalIn())
}