|  | 
|  | 1 | +package sdktests | 
|  | 2 | + | 
|  | 3 | +import ( | 
|  | 4 | +	"time" | 
|  | 5 | + | 
|  | 6 | +	"github.com/launchdarkly/go-sdk-common/v3/ldcontext" | 
|  | 7 | +	"github.com/launchdarkly/go-sdk-common/v3/ldvalue" | 
|  | 8 | +	"github.com/launchdarkly/sdk-test-harness/v2/framework/harness" | 
|  | 9 | +	"github.com/launchdarkly/sdk-test-harness/v2/framework/ldtest" | 
|  | 10 | +	o "github.com/launchdarkly/sdk-test-harness/v2/framework/opt" | 
|  | 11 | +	"github.com/launchdarkly/sdk-test-harness/v2/servicedef" | 
|  | 12 | + | 
|  | 13 | +	"github.com/stretchr/testify/assert" | 
|  | 14 | +) | 
|  | 15 | + | 
|  | 16 | +// CommonInstanceIDTests groups together event-related test methods that are shared between server-side and client-side. | 
|  | 17 | +type CommonInstanceIDTests struct { | 
|  | 18 | +	commonTestsBase | 
|  | 19 | +} | 
|  | 20 | + | 
|  | 21 | +func NewCommonInstanceIDTests(t *ldtest.T, testName string, baseSDKConfigurers ...SDKConfigurer) CommonInstanceIDTests { | 
|  | 22 | +	return CommonInstanceIDTests{newCommonTestsBase(t, testName, baseSDKConfigurers...)} | 
|  | 23 | +} | 
|  | 24 | + | 
|  | 25 | +func (c CommonInstanceIDTests) Run(t *ldtest.T) { | 
|  | 26 | +	t.RequireCapability(servicedef.CapabilityInstanceID) | 
|  | 27 | + | 
|  | 28 | +	verifyRequestHeader := func(t *ldtest.T, endpoint *harness.MockEndpoint) { | 
|  | 29 | +		request := endpoint.RequireConnection(t, time.Second) | 
|  | 30 | +		assert.NotEmpty(t, request.Headers.Get("X-LaunchDarkly-Instance-Id")) | 
|  | 31 | +	} | 
|  | 32 | + | 
|  | 33 | +	t.Run("stream requests", func(t *ldtest.T) { | 
|  | 34 | +		dataSource := NewSDKDataSource(t, nil, DataSourceOptionStreaming()) | 
|  | 35 | +		configurers := c.baseSDKConfigurationPlus(dataSource) | 
|  | 36 | +		if c.isClientSide { | 
|  | 37 | +			// client-side SDKs in streaming mode may *also* need a polling data source | 
|  | 38 | +			configurers = append(configurers, | 
|  | 39 | +				NewSDKDataSource(t, nil, DataSourceOptionPolling())) | 
|  | 40 | +		} | 
|  | 41 | +		_ = NewSDKClient(t, configurers...) | 
|  | 42 | +		verifyRequestHeader(t, dataSource.Endpoint()) | 
|  | 43 | +	}) | 
|  | 44 | + | 
|  | 45 | +	t.Run("poll requests", func(t *ldtest.T) { | 
|  | 46 | +		t.Capabilities().HasAny(servicedef.CapabilityServerSidePolling, servicedef.CapabilityClientSide) | 
|  | 47 | + | 
|  | 48 | +		dataSource := NewSDKDataSource(t, nil, DataSourceOptionPolling()) | 
|  | 49 | +		_ = NewSDKClient(t, c.baseSDKConfigurationPlus(dataSource)...) | 
|  | 50 | +		verifyRequestHeader(t, dataSource.Endpoint()) | 
|  | 51 | +	}) | 
|  | 52 | + | 
|  | 53 | +	t.Run("event posts", func(t *ldtest.T) { | 
|  | 54 | +		dataSource := NewSDKDataSource(t, nil) | 
|  | 55 | +		events := NewSDKEventSink(t) | 
|  | 56 | +		client := NewSDKClient(t, c.baseSDKConfigurationPlus( | 
|  | 57 | +			dataSource, | 
|  | 58 | +			events)...) | 
|  | 59 | + | 
|  | 60 | +		c.sendArbitraryEvent(t, client) | 
|  | 61 | +		client.FlushEvents(t) | 
|  | 62 | + | 
|  | 63 | +		verifyRequestHeader(t, events.Endpoint()) | 
|  | 64 | +	}) | 
|  | 65 | +} | 
|  | 66 | + | 
|  | 67 | +func (c CommonInstanceIDTests) RunPHP(t *ldtest.T) { | 
|  | 68 | +	t.RequireCapability(servicedef.CapabilityInstanceID) | 
|  | 69 | + | 
|  | 70 | +	verifyRequestHeader := func(t *ldtest.T, endpoint *harness.MockEndpoint) { | 
|  | 71 | +		request := endpoint.RequireConnection(t, time.Second) | 
|  | 72 | +		assert.NotEmpty(t, request.Headers.Get("X-LaunchDarkly-Instance-Id")) | 
|  | 73 | +	} | 
|  | 74 | + | 
|  | 75 | +	t.Run("poll requests", func(t *ldtest.T) { | 
|  | 76 | +		dataSource := NewSDKDataSource(t, nil) | 
|  | 77 | +		client := NewSDKClient(t, c.baseSDKConfigurationPlus(dataSource)...) | 
|  | 78 | +		client.EvaluateFlag(t, servicedef.EvaluateFlagParams{ | 
|  | 79 | +			FlagKey:      "flag-key", | 
|  | 80 | +			Context:      o.Some(ldcontext.New("key")), | 
|  | 81 | +			ValueType:    servicedef.ValueTypeBool, | 
|  | 82 | +			DefaultValue: ldvalue.Bool(false), | 
|  | 83 | +			Detail:       false, | 
|  | 84 | +		}) | 
|  | 85 | + | 
|  | 86 | +		verifyRequestHeader(t, dataSource.Endpoint()) | 
|  | 87 | +	}) | 
|  | 88 | + | 
|  | 89 | +	t.Run("event posts", func(t *ldtest.T) { | 
|  | 90 | +		dataSource := NewSDKDataSource(t, nil) | 
|  | 91 | +		events := NewSDKEventSink(t) | 
|  | 92 | +		client := NewSDKClient(t, c.baseSDKConfigurationPlus( | 
|  | 93 | +			dataSource, | 
|  | 94 | +			events)...) | 
|  | 95 | + | 
|  | 96 | +		c.sendArbitraryEvent(t, client) | 
|  | 97 | +		client.FlushEvents(t) | 
|  | 98 | + | 
|  | 99 | +		verifyRequestHeader(t, events.Endpoint()) | 
|  | 100 | +	}) | 
|  | 101 | +} | 
0 commit comments