1package app
2
3import (
4 "context"
5 "testing"
6 "time"
7
8 "github.com/stretchr/testify/require"
9
10 "github.com/bnema/neferwl/internal/ports"
11)
12
13func TestCapturedDemux(t *testing.T) {
14 ctx, cancel := context.WithCancel(context.Background())
15 defer cancel()
16 in := make(chan ports.CaptureDone, 4)
17 wl := make(chan ports.CaptureDone, 4)
18 internal := make(chan ports.CaptureDone, 4)
19 exited := make(chan struct{})
20 go func() { routeCaptured(ctx, in, wl, internal); close(exited) }()
21
22 in <- ports.CaptureDone{ID: 7}
23 in <- ports.CaptureDone{ID: ports.CaptureIDInternal | 3}
24 require.Equal(t, uint64(7), recvDone(t, wl).ID)
25 require.Equal(t, ports.CaptureIDInternal|3, recvDone(t, internal).ID)
26 require.Empty(t, wl)
27 require.Empty(t, internal)
28
29 cancel()
30 select {
31 case <-exited:
32 case <-time.After(2 * time.Second):
33 t.Fatal("routeCaptured did not return on cancel")
34 }
35}
36
37func TestCapturedDemuxCancelWhileBlocked(t *testing.T) {
38 ctx, cancel := context.WithCancel(context.Background())
39 in := make(chan ports.CaptureDone, 1)
40 wl := make(chan ports.CaptureDone) // never read
41 exited := make(chan struct{})
42 go func() { routeCaptured(ctx, in, wl, nil); close(exited) }()
43 in <- ports.CaptureDone{ID: 1}
44 cancel()
45 select {
46 case <-exited:
47 case <-time.After(2 * time.Second):
48 t.Fatal("routeCaptured blocked on a full destination after cancel")
49 }
50}
51
52func TestCapturedDemuxDropsInternalWithoutConsumer(t *testing.T) {
53 ctx, cancel := context.WithCancel(context.Background())
54 defer cancel()
55 in := make(chan ports.CaptureDone, 2)
56 wl := make(chan ports.CaptureDone, 2)
57 go routeCaptured(ctx, in, wl, nil)
58 in <- ports.CaptureDone{ID: ports.CaptureIDInternal | 1}
59 in <- ports.CaptureDone{ID: 2}
60 require.Equal(t, uint64(2), recvDone(t, wl).ID)
61}
62
63func recvDone(t *testing.T, ch <-chan ports.CaptureDone) ports.CaptureDone {
64 t.Helper()
65 select {
66 case d := <-ch:
67 return d
68 case <-time.After(2 * time.Second):
69 t.Fatal("no capture reply")
70 return ports.CaptureDone{}
71 }
72}