github.com/cilium/cilium@v1.16.2/pkg/maps/signalmap/fake/signalmap.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Cilium 3 4 package fake 5 6 import ( 7 "os" 8 9 "github.com/cilium/ebpf/perf" 10 11 "github.com/cilium/cilium/pkg/inctimer" 12 "github.com/cilium/cilium/pkg/maps/signalmap" 13 "github.com/cilium/cilium/pkg/time" 14 ) 15 16 type fakeSignalMap struct { 17 messages [][]byte 18 interval time.Duration 19 } 20 21 func NewFakeSignalMap(messages [][]byte, interval time.Duration) *fakeSignalMap { 22 return &fakeSignalMap{ 23 messages: messages, 24 interval: interval, 25 } 26 } 27 28 type fakePerfReader struct { 29 index int 30 messages [][]byte 31 interval time.Duration 32 pause chan bool 33 closed chan struct{} 34 } 35 36 func (r *fakePerfReader) Read() (perf.Record, error) { 37 timer, timerDone := inctimer.New() 38 defer timerDone() 39 40 paused := false 41 42 for { 43 select { 44 case <-r.closed: 45 return perf.Record{}, os.ErrClosed 46 case paused = <-r.pause: 47 if paused { 48 continue 49 } 50 // Block for the given interval between messages 51 case <-timer.After(r.interval): 52 } 53 if r.index == len(r.messages) { 54 r.index = 0 55 } 56 if r.index < len(r.messages) { 57 return perf.Record{RawSample: r.messages[r.index]}, nil 58 } else { 59 return perf.Record{LostSamples: 1}, nil 60 } 61 } 62 } 63 64 func (r *fakePerfReader) Pause() error { 65 r.pause <- true 66 return nil 67 } 68 69 func (r *fakePerfReader) Resume() error { 70 r.pause <- false 71 return nil 72 } 73 74 func (r *fakePerfReader) Close() error { 75 close(r.closed) 76 return nil 77 } 78 79 func (f fakeSignalMap) NewReader() (signalmap.PerfReader, error) { 80 return &fakePerfReader{ 81 messages: f.messages, 82 interval: f.interval, 83 pause: make(chan bool, 100), 84 closed: make(chan struct{}), 85 }, nil 86 } 87 88 func (sm *fakeSignalMap) MapName() string { 89 return "fakesignalmap" 90 }