...

Source file src/github.com/launchdarkly/go-sdk-events/v2/mock_event_sender_test.go

Documentation: github.com/launchdarkly/go-sdk-events/v2

     1  package ldevents
     2  
     3  import (
     4  	"encoding/json"
     5  	"sync"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  type mockEventSender struct {
    13  	events             []json.RawMessage
    14  	diagnosticEvents   []json.RawMessage
    15  	eventsCh           chan json.RawMessage
    16  	diagnosticEventsCh chan json.RawMessage
    17  	payloadCount       int
    18  	result             EventSenderResult
    19  	gateCh             <-chan struct{}
    20  	waitingCh          chan<- struct{}
    21  	lock               sync.Mutex
    22  }
    23  
    24  func newMockEventSender() *mockEventSender {
    25  	return &mockEventSender{
    26  		eventsCh:           make(chan json.RawMessage, 100),
    27  		diagnosticEventsCh: make(chan json.RawMessage, 100),
    28  		result:             EventSenderResult{Success: true},
    29  	}
    30  }
    31  
    32  func (ms *mockEventSender) SendEventData(kind EventDataKind, data []byte, eventCount int) EventSenderResult {
    33  	ms.lock.Lock()
    34  	if kind == DiagnosticEventDataKind {
    35  		ms.diagnosticEvents = append(ms.diagnosticEvents, data)
    36  		ms.diagnosticEventsCh <- data
    37  	} else {
    38  		var dataAsArray []json.RawMessage
    39  		if err := json.Unmarshal(data, &dataAsArray); err != nil {
    40  			panic(err)
    41  		}
    42  		for _, elementData := range dataAsArray {
    43  			ms.events = append(ms.events, elementData)
    44  			ms.eventsCh <- elementData
    45  		}
    46  		ms.payloadCount++
    47  	}
    48  	gateCh, waitingCh := ms.gateCh, ms.waitingCh
    49  	result := ms.result
    50  	ms.lock.Unlock()
    51  
    52  	if gateCh != nil {
    53  		// instrumentation used for TestBlockingFlush and TestEventsAreKeptInBufferIfAllFlushWorkersAreBusy
    54  		waitingCh <- struct{}{}
    55  		<-gateCh
    56  	}
    57  
    58  	return result
    59  }
    60  
    61  func (ms *mockEventSender) setGate(gateCh <-chan struct{}, waitingCh chan<- struct{}) {
    62  	ms.lock.Lock()
    63  	ms.gateCh = gateCh
    64  	ms.waitingCh = waitingCh
    65  	ms.lock.Unlock()
    66  }
    67  
    68  func (ms *mockEventSender) getPayloadCount() int {
    69  	ms.lock.Lock()
    70  	defer ms.lock.Unlock()
    71  	return ms.payloadCount
    72  }
    73  
    74  func (ms *mockEventSender) awaitEvent(t *testing.T) json.RawMessage {
    75  	event, ok := ms.tryAwaitEvent()
    76  	if !ok {
    77  		require.Fail(t, "timed out waiting for analytics event")
    78  	}
    79  	return event
    80  }
    81  
    82  func (ms *mockEventSender) tryAwaitEvent() (json.RawMessage, bool) {
    83  	return ms.tryAwaitEventCh(ms.eventsCh)
    84  }
    85  
    86  func (ms *mockEventSender) awaitDiagnosticEvent(t *testing.T) json.RawMessage {
    87  	event, ok := ms.tryAwaitEventCh(ms.diagnosticEventsCh)
    88  	if !ok {
    89  		require.Fail(t, "timed out waiting for diagnostic event")
    90  	}
    91  	return event
    92  }
    93  
    94  func (ms *mockEventSender) tryAwaitEventCh(ch <-chan json.RawMessage) (json.RawMessage, bool) {
    95  	select {
    96  	case e := <-ch:
    97  		return e, true
    98  	case <-time.After(time.Second):
    99  		break
   100  	}
   101  	return nil, false
   102  }
   103  
   104  func (ms *mockEventSender) assertNoMoreEvents(t *testing.T) {
   105  	require.Len(t, ms.eventsCh, 0)
   106  }
   107  
   108  func (ms *mockEventSender) assertNoMoreDiagnosticEvents(t *testing.T) {
   109  	require.Len(t, ms.diagnosticEventsCh, 0)
   110  }
   111  

View as plain text