private void MergeComponentProperties(LdValue.ObjectBuilder builder, object component, string defaultPropertyName) { if (!(component is IDiagnosticDescription)) { if (!string.IsNullOrEmpty(defaultPropertyName)) { builder.Add(defaultPropertyName, "custom"); } return; } var componentDesc = (component as IDiagnosticDescription).DescribeConfiguration(BasicConfig); if (!string.IsNullOrEmpty(defaultPropertyName)) { builder.Add(defaultPropertyName, componentDesc.IsString ? componentDesc : LdValue.Of("custom")); } else if (componentDesc.Type == LdValueType.Object) { foreach (KeyValuePair <string, LdValue> prop in componentDesc.AsDictionary(LdValue.Convert.Json)) { builder.Add(prop.Key, prop.Value); // TODO: filter allowable properties } } }
private void TestDiagnosticConfig( Func <ConfigurationBuilder, ConfigurationBuilder> modConfig, Func <EventProcessorBuilder, EventProcessorBuilder> modEvents, LdValue.ObjectBuilder expected ) { var eventsBuilder = Components.SendEvents() .EventSender(testEventSender); modEvents?.Invoke(eventsBuilder); var configBuilder = BasicConfig() .DataSource(null) .Events(eventsBuilder) .Http(Components.HttpConfiguration().MessageHandler(new StubMessageHandler(HttpStatusCode.Unauthorized))) .StartWaitTime(testStartWaitTime); configBuilder = modConfig is null ? configBuilder : modConfig(configBuilder); using (var client = new LdClient(configBuilder.Build())) { var payload = testEventSender.RequirePayload(); Assert.Equal(EventDataKind.DiagnosticEvent, payload.Kind); Assert.Equal(1, payload.EventCount); var data = JsonOf(payload.Data); AssertJsonEqual(JsonFromValue("diagnostic-init"), data.Property("kind")); AssertJsonEqual(JsonOf(expected.Build().ToJsonString()), data.Property("configuration")); } }
private void TestDiagnosticConfig( Func <ConfigurationBuilder, ConfigurationBuilder> modConfig, Func <EventProcessorBuilder, EventProcessorBuilder> modEvents, LdValue.ObjectBuilder expected ) { var eventsBuilder = Components.SendEvents() .EventSender(_testEventSender); modEvents?.Invoke(eventsBuilder); var configBuilder = BasicConfig() .DataSource(Components.StreamingDataSource()) .Events(eventsBuilder) .Http(Components.HttpConfiguration().MessageHandler(Error401Response.AsMessageHandler())); modConfig?.Invoke(configBuilder); using (var client = TestUtil.CreateClient(configBuilder.Build(), BasicUser, testStartWaitTime)) { var data = ExpectDiagnosticEvent(); AssertJsonEqual(JsonFromValue("diagnostic-init"), data.Property("kind")); AssertJsonEqual(JsonOf(expected.Build().ToJsonString()), data.Property("configuration")); } }
private void TestDiagnosticConfig( Func <ConfigurationBuilder, ConfigurationBuilder> modConfig, Func <EventProcessorBuilder, EventProcessorBuilder> modEvents, LdValue.ObjectBuilder expected ) { var eventsBuilder = Components.SendEvents() .EventSender(testEventSender); modEvents?.Invoke(eventsBuilder); var configBuilder = Configuration.Builder(sdkKey) .Events(eventsBuilder) .Http(Components.HttpConfiguration().MessageHandler(new StubMessageHandler(HttpStatusCode.Unauthorized))) .Logging(Components.Logging(testLogging)) .StartWaitTime(testStartWaitTime); modConfig?.Invoke(configBuilder); using (var client = new LdClient(configBuilder.Build())) { var payload = testEventSender.RequirePayload(); Assert.Equal(EventDataKind.DiagnosticEvent, payload.Kind); Assert.Equal(1, payload.EventCount); var data = LdValue.Parse(payload.Data); Assert.Equal("diagnostic-init", data.Get("kind").AsString); AssertHelpers.JsonEqual(expected.Build(), data.Get("configuration")); } }
/// <summary> /// Adds the standard properties for polling. /// </summary> /// <param name="builder">the object builder</param> /// <param name="customPollingBaseUri">true if the SDK is using a custom base URI for polling</param> /// <param name="pollingInterval">the polling interval</param> /// <returns>the builder</returns> public static LdValue.ObjectBuilder WithPollingProperties( this LdValue.ObjectBuilder builder, bool customPollingBaseUri, TimeSpan pollingInterval ) => builder.Set("streamingDisabled", true) .Set("customBaseURI", customPollingBaseUri) .Set("pollingIntervalMillis", pollingInterval.TotalMilliseconds);
/// <summary> /// Adds the standard properties for streaming. /// </summary> /// <param name="builder">the object builder</param> /// <param name="customStreamingBaseUri">true if the SDK is using a custom base URI for streaming</param> /// <param name="customPollingBaseUri">true if the SDK is using a custom base URI for polling</param> /// <param name="initialReconnectDelay">the initial reconnect delay</param> /// <returns>the builder</returns> public static LdValue.ObjectBuilder WithStreamingProperties( this LdValue.ObjectBuilder builder, bool customStreamingBaseUri, bool customPollingBaseUri, TimeSpan initialReconnectDelay ) => builder.Set("streamingDisabled", false) .Set("customBaseURI", customPollingBaseUri) .Set("customStreamURI", customStreamingBaseUri) .Set("reconnectTimeMillis", initialReconnectDelay.TotalMilliseconds);
public static LdValue.ObjectBuilder WithEventsDefaults(this LdValue.ObjectBuilder b) => b.Add("allAttributesPrivate", false) .Add("customEventsURI", false) .Add("diagnosticRecordingIntervalMillis", EventProcessorBuilder.DefaultDiagnosticRecordingInterval.TotalMilliseconds) .Add("eventsCapacity", EventProcessorBuilder.DefaultCapacity) .Add("eventsFlushIntervalMillis", EventProcessorBuilder.DefaultFlushInterval.TotalMilliseconds) .Add("inlineUsersInEvents", false) .Add("samplingInterval", 0) .Add("userKeysCapacity", EventProcessorBuilder.DefaultUserKeysCapacity) .Add("userKeysFlushIntervalMillis", EventProcessorBuilder.DefaultUserKeysFlushInterval.TotalMilliseconds);
/// <summary> /// Adds the standard properties for events configuration. /// </summary> /// <param name="builder">the object builder</param> /// <param name="config">the standard event properties</param> /// <param name="customEventsBaseUri">true if the SDK is using a custom base URI for events</param> /// <returns>the builder</returns> public static LdValue.ObjectBuilder WithEventProperties( this LdValue.ObjectBuilder builder, EventsConfiguration config, bool customEventsBaseUri ) => builder.Set("allAttributesPrivate", config.AllAttributesPrivate) .Set("customEventsURI", customEventsBaseUri) .Set("diagnosticRecordingIntervalMillis", config.DiagnosticRecordingInterval.TotalMilliseconds) .Set("eventsCapacity", config.EventCapacity) .Set("eventsFlushIntervalMillis", config.EventFlushInterval.TotalMilliseconds) .Set("inlineUsersInEvents", config.InlineUsersInEvents);
/// <summary> /// Adds the standard <c>startWaitMillis</c> property. /// </summary> /// <param name="builder">the object builder</param> /// <param name="value">the value</param> /// <returns>the builder</returns> public static LdValue.ObjectBuilder WithStartWaitTime(this LdValue.ObjectBuilder builder, TimeSpan value) => builder.Set("startWaitMillis", value.TotalMilliseconds);
/// <summary> /// Adds the standard properties for HTTP configuration. /// </summary> /// <param name="builder">the object builder</param> /// <param name="props">the standard HTTP properties</param> /// <returns>the builder</returns> public static LdValue.ObjectBuilder WithHttpProperties(this LdValue.ObjectBuilder builder, HttpProperties props) => builder.Set("connectTimeoutMillis", props.ConnectTimeout.TotalMilliseconds) .Set("socketTimeoutMillis", props.ReadTimeout.TotalMilliseconds) .Set("usingProxy", DetectProxy(props)) .Set("usingProxyAuthenticator", DetectProxyAuth(props));
/// <summary> /// Adds the standard <c>autoAliasingOptOut</c> property. /// </summary> /// <param name="builder">the object builder</param> /// <param name="value">the value</param> /// <returns>the builder</returns> public static LdValue.ObjectBuilder WithAutoAliasingOptOut(this LdValue.ObjectBuilder builder, bool value) => builder.Set("autoAliasingOptOut", value);
private void AddDiagnosticCommonFields(LdValue.ObjectBuilder fieldsBuilder, string kind, DateTime creationDate) { fieldsBuilder.Add("kind", kind); fieldsBuilder.Add("id", EncodeDiagnosticId(DiagnosticId)); fieldsBuilder.Add("creationDate", UnixMillisecondTime.FromDateTime(creationDate).Value); }
public static LdValue.ObjectBuilder WithPollingDefaults(this LdValue.ObjectBuilder b) => b.Set("streamingDisabled", true) .Set("pollingIntervalMillis", PollingDataSourceBuilder.DefaultPollInterval.TotalMilliseconds) .Remove("customStreamURI") .Remove("reconnectTimeMillis");
public static LdValue.ObjectBuilder WithStreamingDefaults(this LdValue.ObjectBuilder b) => b.Add("customBaseURI", false) .Add("customStreamURI", false) .Add("streamingDisabled", false) .Add("reconnectTimeMillis", StreamingDataSourceBuilder.DefaultInitialReconnectDelay.TotalMilliseconds) .Add("usingRelayDaemon", false);
public static LdValue.ObjectBuilder WithStoreDefaults(this LdValue.ObjectBuilder b) => b.Add("dataStoreType", "memory");