...

Source file src/github.com/launchdarkly/go-server-sdk/v6/internal/sharedtest/mocks/mock_big_segment_store.go

Documentation: github.com/launchdarkly/go-server-sdk/v6/internal/sharedtest/mocks

     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  // MockBigSegmentStore is a minimal mock implementation of BigSegmentStore. Currently it only
    18  // supports specifying the metadata and simulating an error for metadata queries.
    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 { //nolint:revive
    30  	return nil
    31  }
    32  
    33  func (m *MockBigSegmentStore) GetMetadata() (subsystems.BigSegmentStoreMetadata, error) { //nolint:revive
    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( //nolint:revive
    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() { //nolint:revive
    53  	m.TestSetMetadataState(subsystems.BigSegmentStoreMetadata{LastUpToDate: ldtime.UnixMillisNow()}, nil)
    54  }
    55  
    56  func (m *MockBigSegmentStore) TestGetMetadataQueriesCh() <-chan struct{} { //nolint:revive
    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( //nolint:revive
    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( //nolint:revive
    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) { //nolint:revive
    90  	m.lock.Lock()
    91  	defer m.lock.Unlock()
    92  	m.membershipErr = err
    93  }
    94  
    95  func (m *MockBigSegmentStore) TestGetMembershipQueries() []string { //nolint:revive
    96  	m.lock.Lock()
    97  	defer m.lock.Unlock()
    98  	return append([]string(nil), m.membershipQueries...)
    99  }
   100  
   101  // ExpectBigSegmentStoreStatus waits for a status value to appear in a channel and also verifies that it
   102  // matches the status currently being reported by the status provider.
   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