1 package ldclient
2
3 import (
4 "errors"
5 "testing"
6 "time"
7
8 "github.com/launchdarkly/go-server-sdk/v6/internal/sharedtest/mocks"
9
10 "github.com/launchdarkly/go-sdk-common/v3/lduser"
11 ldevents "github.com/launchdarkly/go-sdk-events/v2"
12 "github.com/launchdarkly/go-server-sdk/v6/internal/sharedtest"
13 "github.com/launchdarkly/go-server-sdk/v6/ldcomponents"
14 "github.com/launchdarkly/go-server-sdk/v6/subsystems"
15
16 "github.com/stretchr/testify/assert"
17 "github.com/stretchr/testify/require"
18 )
19
20 const testSdkKey = "test-sdk-key"
21
22 func TestErrorFromComponentFactoryStopsClientCreation(t *testing.T) {
23 fakeError := errors.New("sorry")
24
25 doTest := func(name string, config Config, expectedError error) {
26 t.Run(name, func(t *testing.T) {
27 client, err := MakeCustomClient(testSdkKey, config, 0)
28 assert.Nil(t, client)
29 require.Error(t, err)
30 assert.Equal(t, expectedError.Error(), err.Error())
31 })
32 }
33
34 doTest("DataSource", Config{DataSource: mocks.ComponentConfigurerThatReturnsError[subsystems.DataSource]{Err: fakeError}}, fakeError)
35 doTest("DataStore", Config{DataStore: mocks.ComponentConfigurerThatReturnsError[subsystems.DataStore]{Err: fakeError}}, fakeError)
36 doTest("Events", Config{Events: mocks.ComponentConfigurerThatReturnsError[ldevents.EventProcessor]{Err: fakeError}}, fakeError)
37 doTest("HTTP", Config{HTTP: ldcomponents.HTTPConfiguration().CACert([]byte{1})}, errors.New("invalid CA certificate data"))
38 }
39
40 func TestSecureModeHash(t *testing.T) {
41 expected := "aa747c502a898200f9e4fa21bac68136f886a0e27aec70ba06daf2e2a5cb5597"
42 key := "Message"
43 config := Config{Offline: true}
44
45 client, _ := MakeCustomClient("secret", config, 0*time.Second)
46
47 hash := client.SecureModeHash(lduser.NewUser(key))
48
49 assert.Equal(t, expected, hash)
50 }
51
52 func TestMakeCustomClientWithFailedInitialization(t *testing.T) {
53 client, err := MakeCustomClient(testSdkKey, Config{
54 Logging: ldcomponents.Logging().Loggers(sharedtest.NewTestLoggers()),
55 DataSource: mocks.DataSourceThatNeverInitializes(),
56 Events: ldcomponents.NoEvents(),
57 }, time.Second)
58
59 assert.NotNil(t, client)
60 assert.Equal(t, err, ErrInitializationFailed)
61 }
62
63 func TestInvalidCharacterInSDKKey(t *testing.T) {
64 badKey := "my-bad-key\n"
65
66 _, err := MakeClient(badKey, time.Minute)
67 assert.Error(t, err)
68 assert.NotContains(t, err.Error(), "my-bad-key")
69
70 _, err = MakeCustomClient(badKey, Config{}, time.Minute)
71 assert.Error(t, err)
72 assert.NotContains(t, err.Error(), "my-bad-key")
73 }
74
75 func makeTestClient() *LDClient {
76 return makeTestClientWithConfig(nil)
77 }
78
79 func makeTestClientWithConfig(modConfig func(*Config)) *LDClient {
80 config := Config{
81 Offline: false,
82 DataStore: ldcomponents.InMemoryDataStore(),
83 DataSource: mocks.DataSourceThatIsAlwaysInitialized(),
84 Events: mocks.SingleComponentConfigurer[ldevents.EventProcessor]{Instance: &mocks.CapturingEventProcessor{}},
85 Logging: ldcomponents.Logging().Loggers(sharedtest.NewTestLoggers()),
86 }
87 if modConfig != nil {
88 modConfig(&config)
89 }
90 client, _ := MakeCustomClient(testSdkKey, config, time.Duration(0))
91 return client
92 }
93
View as plain text