...
1 package ldclient
2
3 import (
4 "testing"
5
6 "github.com/launchdarkly/go-server-sdk/v6/internal/sharedtest/mocks"
7
8 "github.com/launchdarkly/go-sdk-common/v3/ldlog"
9 "github.com/launchdarkly/go-sdk-common/v3/ldlogtest"
10 "github.com/launchdarkly/go-server-sdk/v6/interfaces"
11 "github.com/launchdarkly/go-server-sdk/v6/internal/datastore"
12 "github.com/launchdarkly/go-server-sdk/v6/ldcomponents"
13 "github.com/launchdarkly/go-server-sdk/v6/subsystems"
14
15 "github.com/stretchr/testify/assert"
16 )
17
18 type clientOfflineTestParams struct {
19 client *LDClient
20 store subsystems.DataStore
21 mockLog *ldlogtest.MockLog
22 }
23
24 func withClientOfflineTestParams(callback func(clientExternalUpdatesTestParams)) {
25 p := clientExternalUpdatesTestParams{}
26 p.store = datastore.NewInMemoryDataStore(ldlog.NewDisabledLoggers())
27 p.mockLog = ldlogtest.NewMockLog()
28 config := Config{
29 Offline: true,
30 DataStore: mocks.SingleComponentConfigurer[subsystems.DataStore]{Instance: p.store},
31 Logging: ldcomponents.Logging().Loggers(p.mockLog.Loggers),
32 }
33 p.client, _ = MakeCustomClient("sdk_key", config, 0)
34 defer p.client.Close()
35 callback(p)
36 }
37
38 func TestClientOfflineMode(t *testing.T) {
39 t.Run("is initialized", func(t *testing.T) {
40 withClientOfflineTestParams(func(p clientExternalUpdatesTestParams) {
41 assert.True(t, p.client.Initialized())
42 assert.Equal(t, interfaces.DataSourceStateValid,
43 p.client.GetDataSourceStatusProvider().GetStatus().State)
44 })
45 })
46
47 t.Run("reports offline status", func(t *testing.T) {
48 withClientOfflineTestParams(func(p clientExternalUpdatesTestParams) {
49 assert.True(t, p.client.IsOffline())
50 })
51 })
52
53 t.Run("logs appropriate message at startup", func(t *testing.T) {
54 withClientOfflineTestParams(func(p clientExternalUpdatesTestParams) {
55 assert.Contains(
56 t,
57 p.mockLog.GetOutput(ldlog.Info),
58 "Starting LaunchDarkly client in offline mode",
59 )
60 })
61 })
62
63 t.Run("returns default values", func(t *testing.T) {
64 withClientOfflineTestParams(func(p clientExternalUpdatesTestParams) {
65 result, err := p.client.BoolVariation("flagkey", evalTestUser, false)
66 assert.NoError(t, err)
67 assert.False(t, result)
68 })
69 })
70
71 t.Run("returns invalid state from AllFlagsState", func(t *testing.T) {
72 withClientOfflineTestParams(func(p clientExternalUpdatesTestParams) {
73 result := p.client.AllFlagsState(evalTestUser)
74 assert.False(t, result.IsValid())
75 })
76 })
77 }
78
View as plain text