...
1 package mocks
2
3 import (
4 "sync"
5 "testing"
6 "time"
7
8 "github.com/launchdarkly/go-sdk-common/v3/ldtime"
9 "github.com/launchdarkly/go-server-sdk/v6/interfaces"
10 "github.com/launchdarkly/go-server-sdk/v6/subsystems"
11
12 th "github.com/launchdarkly/go-test-helpers/v3"
13
14 "github.com/stretchr/testify/require"
15 )
16
17
18
19 type MockBigSegmentStore struct {
20 metadata subsystems.BigSegmentStoreMetadata
21 metadataErr error
22 metadataQueries chan struct{}
23 memberships map[string]subsystems.BigSegmentMembership
24 membershipQueries []string
25 membershipErr error
26 lock sync.Mutex
27 }
28
29 func (m *MockBigSegmentStore) Close() error {
30 return nil
31 }
32
33 func (m *MockBigSegmentStore) GetMetadata() (subsystems.BigSegmentStoreMetadata, error) {
34 m.lock.Lock()
35 md, err := m.metadata, m.metadataErr
36 if m.metadataQueries != nil {
37 m.metadataQueries <- struct{}{}
38 }
39 m.lock.Unlock()
40 return md, err
41 }
42
43 func (m *MockBigSegmentStore) TestSetMetadataState(
44 md subsystems.BigSegmentStoreMetadata,
45 err error,
46 ) {
47 m.lock.Lock()
48 m.metadata, m.metadataErr = md, err
49 m.lock.Unlock()
50 }
51
52 func (m *MockBigSegmentStore) TestSetMetadataToCurrentTime() {
53 m.TestSetMetadataState(subsystems.BigSegmentStoreMetadata{LastUpToDate: ldtime.UnixMillisNow()}, nil)
54 }
55
56 func (m *MockBigSegmentStore) TestGetMetadataQueriesCh() <-chan struct{} {
57 m.lock.Lock()
58 defer m.lock.Unlock()
59 if m.metadataQueries == nil {
60 m.metadataQueries = make(chan struct{})
61 }
62 return m.metadataQueries
63 }
64
65 func (m *MockBigSegmentStore) GetMembership(
66 contextHash string,
67 ) (subsystems.BigSegmentMembership, error) {
68 m.lock.Lock()
69 defer m.lock.Unlock()
70 m.membershipQueries = append(m.membershipQueries, contextHash)
71 if m.membershipErr != nil {
72 return nil, m.membershipErr
73 }
74 return m.memberships[contextHash], nil
75 }
76
77 func (m *MockBigSegmentStore) TestSetMembership(
78 contextHash string,
79 membership subsystems.BigSegmentMembership,
80 ) {
81 m.lock.Lock()
82 defer m.lock.Unlock()
83 if m.memberships == nil {
84 m.memberships = make(map[string]subsystems.BigSegmentMembership)
85 }
86 m.memberships[contextHash] = membership
87 }
88
89 func (m *MockBigSegmentStore) TestSetMembershipError(err error) {
90 m.lock.Lock()
91 defer m.lock.Unlock()
92 m.membershipErr = err
93 }
94
95 func (m *MockBigSegmentStore) TestGetMembershipQueries() []string {
96 m.lock.Lock()
97 defer m.lock.Unlock()
98 return append([]string(nil), m.membershipQueries...)
99 }
100
101
102
103 func ExpectBigSegmentStoreStatus(
104 t *testing.T,
105 statusCh <-chan interfaces.BigSegmentStoreStatus,
106 statusGetter func() interfaces.BigSegmentStoreStatus,
107 timeout time.Duration,
108 expectedStatus interfaces.BigSegmentStoreStatus,
109 ) {
110 newStatus := th.RequireValue(t, statusCh, timeout, "timed out waiting for new status")
111 require.Equal(t, expectedStatus, newStatus)
112 if statusGetter != nil {
113 require.Equal(t, newStatus, statusGetter())
114 }
115 }
116
View as plain text