blob: 7e715b9ea9bd57b135f2e7a3dff5bbd5d00b36dc (
plain) (
blame)
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
|
package main
import (
"os"
"path/filepath"
"testing"
"time"
)
func TestWatchLogDebouncesChanges(t *testing.T) {
logPath := filepath.Join(t.TempDir(), "trace.jsonl")
if err := os.WriteFile(logPath, []byte("initial\n"), 0o644); err != nil {
t.Fatal(err)
}
done := make(chan struct{})
stopped := make(chan struct{})
rebuilt := make(chan struct{}, 2)
go func() {
defer close(stopped)
watchLogUntil(logPath, 60*time.Millisecond, 5*time.Millisecond, done, func() {
rebuilt <- struct{}{}
})
}()
time.Sleep(20 * time.Millisecond)
if err := os.WriteFile(logPath, []byte("first change\n"), 0o644); err != nil {
t.Fatal(err)
}
time.Sleep(30 * time.Millisecond)
if err := os.WriteFile(logPath, []byte("second change\n"), 0o644); err != nil {
t.Fatal(err)
}
select {
case <-rebuilt:
t.Fatal("rebuilt before the debounce interval elapsed")
case <-time.After(40 * time.Millisecond):
}
select {
case <-rebuilt:
case <-time.After(200 * time.Millisecond):
t.Fatal("did not rebuild after changes settled")
}
select {
case <-rebuilt:
t.Fatal("multiple changes produced more than one rebuild")
case <-time.After(40 * time.Millisecond):
}
close(done)
select {
case <-stopped:
case <-time.After(time.Second):
t.Fatal("watcher did not stop")
}
}
|