...
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
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