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  }