Skip to content

Commit 3a243ff

Browse files
committed
test: add LatencyReader unit tests
1 parent 226b6b1 commit 3a243ff

1 file changed

Lines changed: 102 additions & 0 deletions

File tree

audio/latency_test.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
//go:build test_unit
2+
3+
package audio_test
4+
5+
import (
6+
"bytes"
7+
"io"
8+
"testing"
9+
"time"
10+
11+
"github.com/devgianlu/go-librespot/audio"
12+
"github.com/stretchr/testify/assert"
13+
"github.com/stretchr/testify/require"
14+
)
15+
16+
func TestLatencyReader(t *testing.T) {
17+
testData := "Hello, World! This is test data for latency measurement."
18+
reader := &slowTestReader{
19+
data: []byte(testData),
20+
delay: 50 * time.Millisecond,
21+
}
22+
23+
var measuredLatency time.Duration
24+
latencyReader := &audio.LatencyReader{
25+
Reader: reader,
26+
Callback: func(latency time.Duration) {
27+
measuredLatency = latency
28+
},
29+
}
30+
31+
// Read all data
32+
buf := make([]byte, len(testData))
33+
n, err := latencyReader.Read(buf)
34+
require.NoError(t, err)
35+
assert.Equal(t, len(testData), n)
36+
assert.Equal(t, testData, string(buf))
37+
38+
// Ensure EOF is reached
39+
_, err = latencyReader.Read(buf)
40+
assert.ErrorIs(t, err, io.EOF)
41+
42+
// Verify latency was measured
43+
assert.Greater(t, measuredLatency, time.Duration(0))
44+
}
45+
46+
func TestLatencyReaderMultipleReads(t *testing.T) {
47+
testData := "Hello, World! This is test data for multiple reads."
48+
reader := &slowTestReader{
49+
data: []byte(testData),
50+
delay: 50 * time.Millisecond,
51+
}
52+
53+
var latencies []time.Duration
54+
latencyReader := &audio.LatencyReader{
55+
Reader: reader,
56+
Callback: func(latency time.Duration) {
57+
latencies = append(latencies, latency)
58+
},
59+
}
60+
61+
// Read data in chunks
62+
buf := make([]byte, 10)
63+
var result bytes.Buffer
64+
65+
for {
66+
n, err := latencyReader.Read(buf)
67+
if err == io.EOF {
68+
break
69+
}
70+
require.NoError(t, err)
71+
result.Write(buf[:n])
72+
}
73+
74+
assert.Equal(t, testData, result.String())
75+
assert.Greater(t, len(latencies), 0)
76+
77+
// All latencies should be positive
78+
for _, latency := range latencies {
79+
assert.Greater(t, latency, time.Duration(0))
80+
}
81+
}
82+
83+
// Helper for testing slow reads
84+
type slowTestReader struct {
85+
data []byte
86+
pos int
87+
delay time.Duration
88+
}
89+
90+
func (r *slowTestReader) Read(p []byte) (n int, err error) {
91+
if r.delay > 0 {
92+
time.Sleep(r.delay)
93+
}
94+
95+
if r.pos >= len(r.data) {
96+
return 0, io.EOF
97+
}
98+
99+
n = copy(p, r.data[r.pos:])
100+
r.pos += n
101+
return n, nil
102+
}

0 commit comments

Comments
 (0)