public StreamProcessorTest(ITestOutputHelper testOutput) : base(testOutput) { _mockEventSource = new Mock <IEventSource>(); _mockEventSource.Setup(es => es.StartAsync()).Returns(Task.CompletedTask).Callback(() => _esStartedReady.Set()); _eventSource = _mockEventSource.Object; _eventSourceFactory = new TestEventSourceFactory(_eventSource); _dataStore = new DelegatingDataStoreForStreamTests { WrappedStore = new InMemoryDataStore() }; _dataStoreUpdates = new DataStoreUpdatesImpl(new TaskExecutor(testLogger)); _dataStoreStatusProvider = new DataStoreStatusProviderImpl(_dataStore, _dataStoreUpdates); _dataSourceUpdates = new DataSourceUpdatesImpl( _dataStore, _dataStoreStatusProvider, new TaskExecutor(testLogger), testLogger, null ); _dataSourceStatusProvider = new DataSourceStatusProviderImpl(_dataSourceUpdates); _config = Configuration.Builder(SDK_KEY) .DataSource(Components.StreamingDataSource().EventSourceCreator(_eventSourceFactory.Create())) .DataStore(TestUtils.SpecificDataStore(_dataStore)) .Logging(Components.Logging(testLogging)) .Build(); }
public PollingProcessorTest(ITestOutputHelper testOutput) : base(testOutput) { _mockFeatureRequestor = new Mock <IFeatureRequestor>(); _featureRequestor = _mockFeatureRequestor.Object; _dataStore = new InMemoryDataStore(); var dataSourceUpdatesImpl = TestUtils.BasicDataSourceUpdates(_dataStore, testLogger); _dataSourceUpdates = dataSourceUpdatesImpl; _dataSourceStatusProvider = new DataSourceStatusProviderImpl(dataSourceUpdatesImpl); _config = Configuration.Default(sdkKey); _context = new LdClientContext(new BasicConfiguration(sdkKey, false, testLogger), _config); }
public StreamProcessorTest(ITestOutputHelper testOutput) : base(testOutput) { _mockEventSource = new Mock <IEventSource>(); _mockEventSource.Setup(es => es.StartAsync()).Returns(TestUtils.CompletedTask()).Callback(() => _esStartedReady.Set()); _eventSource = _mockEventSource.Object; _eventSourceFactory = new TestEventSourceFactory(_eventSource); _dataStore = new DelegatingDataStoreForStreamTests { WrappedStore = new InMemoryDataStore() }; _dataStoreUpdates = new DataStoreUpdatesImpl(BasicTaskExecutor, TestLogger); _dataStoreStatusProvider = new DataStoreStatusProviderImpl(_dataStore, _dataStoreUpdates); _dataSourceUpdates = new DataSourceUpdatesImpl( _dataStore, _dataStoreStatusProvider, BasicTaskExecutor, TestLogger, null ); _dataSourceStatusProvider = new DataSourceStatusProviderImpl(_dataSourceUpdates); _config = BasicConfig() .DataSource(Components.StreamingDataSource().EventSourceCreator(_eventSourceFactory.Create())) .DataStore(_dataStore.AsSingletonFactory()) .Build(); }
LdClient(Configuration configuration, User user, TimeSpan startWaitTime) { if (user == null) { throw new ArgumentNullException(nameof(user)); } _config = configuration ?? throw new ArgumentNullException(nameof(configuration)); var diagnosticStore = _config.DiagnosticOptOut ? null : new ClientDiagnosticStore(_config, startWaitTime); var diagnosticDisabler = _config.DiagnosticOptOut ? null : new DiagnosticDisablerImpl(); _context = new LdClientContext(configuration, this, diagnosticStore, diagnosticDisabler); _log = _context.BaseLogger; _taskExecutor = _context.TaskExecutor; diagnosticStore?.SetContext(_context); _log.Info("Starting LaunchDarkly Client {0}", Version); var persistenceConfiguration = (configuration.PersistenceConfigurationBuilder ?? Components.Persistence()) .CreatePersistenceConfiguration(_context); _dataStore = new FlagDataManager( configuration.MobileKey, persistenceConfiguration, _log.SubLogger(LogNames.DataStoreSubLog) ); _userDecorator = new UserDecorator(configuration.DeviceInfo ?? new DefaultDeviceInfo(), _dataStore.PersistentStore); _user = _userDecorator.DecorateUser(user); // If we had cached data for the new user, set the current in-memory flag data state to use // that data, so that any Variation calls made before Identify has completed will use the // last known values. var cachedData = _dataStore.GetCachedData(_user); if (cachedData != null) { _log.Debug("Cached flag data is available for this user"); _dataStore.Init(_user, cachedData.Value, false); // false means "don't rewrite the flags to persistent storage" } var dataSourceUpdateSink = new DataSourceUpdateSinkImpl( _dataStore, configuration.Offline, _taskExecutor, _log.SubLogger(LogNames.DataSourceSubLog) ); _dataSourceUpdateSink = dataSourceUpdateSink; _dataSourceStatusProvider = new DataSourceStatusProviderImpl(dataSourceUpdateSink); _flagTracker = new FlagTrackerImpl(dataSourceUpdateSink); var dataSourceFactory = configuration.DataSourceFactory ?? Components.StreamingDataSource(); _connectivityStateManager = Factory.CreateConnectivityStateManager(configuration); var isConnected = _connectivityStateManager.IsConnected; diagnosticDisabler?.SetDisabled(!isConnected || configuration.Offline); _eventProcessor = (configuration.EventProcessorFactory ?? Components.SendEvents()) .CreateEventProcessor(_context); _eventProcessor.SetOffline(configuration.Offline || !isConnected); _connectionManager = new ConnectionManager( _context, dataSourceFactory, _dataSourceUpdateSink, _eventProcessor, diagnosticDisabler, configuration.EnableBackgroundUpdating, _user, _log ); _connectionManager.SetForceOffline(configuration.Offline); _connectionManager.SetNetworkEnabled(isConnected); if (configuration.Offline) { _log.Info("Starting LaunchDarkly client in offline mode"); } _connectivityStateManager.ConnectionChanged += networkAvailable => { _log.Debug("Setting online to {0} due to a connectivity change event", networkAvailable); _ = _connectionManager.SetNetworkEnabled(networkAvailable); // do not await the result }; // Send an initial identify event, but only if we weren't explicitly set to be offline if (!configuration.Offline) { _eventProcessor.RecordIdentifyEvent(new EventProcessorTypes.IdentifyEvent { Timestamp = UnixMillisecondTime.Now, User = user }); } _backgroundModeManager = _config.BackgroundModeManager ?? new DefaultBackgroundModeManager(); _backgroundModeManager.BackgroundModeChanged += OnBackgroundModeChanged; }