public (List <Node> Nodes, List <Edge> Edges) GenerateGraph() { Console.WriteLine("Configuring state machine"); var entryPoints = new StateMachineEntryPoints(); var configurator = new Configurator(); configureTransitions(configurator, entryPoints); Console.WriteLine("Extracting states and state results"); var allStateResults = getAllStateResultsByState(configurator.AllDistinctStatesInOrder); var stateNodes = makeNodesForStates(configurator.AllDistinctStatesInOrder); var stateResultCount = allStateResults.Sum(s => s.StateResults.Count); Console.WriteLine($"Found {stateNodes.Count} states and {stateResultCount} state results"); var edges = getEdgesBetweenStates(allStateResults, configurator, stateNodes); var nodes = stateNodes.Values.ToList(); Console.WriteLine("Created graph nodes and edges"); var entryPointCount = addEntryPoints(edges, nodes, entryPoints, configurator, stateNodes); var looseEndCount = addLooseEnds(edges, nodes, allStateResults, configurator, stateNodes); Console.WriteLine($"Found and added {entryPointCount} entry points and {looseEndCount} loose ends"); return(nodes, edges); }
private static TestConfigurator configureTogglSyncGraph() { var configurator = new TestConfigurator(); var entryPoints = new StateMachineEntryPoints(); var dependencyContainer = new TestDependencyContainer(); dependencyContainer.MockKeyValueStorage = Substitute.For <IKeyValueStorage>(); dependencyContainer.MockPushNotificationsTokenService = Substitute.For <IPushNotificationsTokenService>(); dependencyContainer.MockTimeService = Substitute.For <ITimeService>(); dependencyContainer.MockRemoteConfigService = Substitute.For <IRemoteConfigService>(); dependencyContainer.MockPushNotificationsTokenStorage = Substitute.For <IPushNotificationsTokenStorage>(); configurator.AllDistinctStatesInOrder.Add(entryPoints); TogglSyncManager.ConfigureTransitions( configurator, Substitute.For <ITogglDatabase>(), Substitute.For <ITogglApi>(), Substitute.For <ITogglDataSource>(), Substitute.For <IScheduler>(), Substitute.For <ITimeService>(), Substitute.For <IAnalyticsService>(), Substitute.For <ILastTimeUsageStorage>(), entryPoints, Substitute.For <ISyncStateQueue>(), dependencyContainer ); return(configurator); }
protected void Reset() { Queue = new SyncStateQueue(); Transitions = new TransitionHandlerProvider(); Scheduler = new TestScheduler(); StateMachine = new StateMachine(Transitions, Scheduler, Substitute.For <ISubject <Unit> >()); EntryPoints = new StateMachineEntryPoints(); Orchestrator = new StateMachineOrchestrator(StateMachine, EntryPoints); SyncManager = new SyncManager(Queue, Orchestrator); }
public static void ConfigureTransitions( TransitionHandlerProvider transitions, ITogglDatabase database, ITogglApi api, ITogglDataSource dataSource, IScheduler scheduler, ITimeService timeService, StateMachineEntryPoints entryPoints) { configurePullTransitions(transitions, database, api, dataSource, timeService, entryPoints.StartPullSync); configurePushTransitions(transitions, database, api, dataSource, scheduler, entryPoints.StartPushSync); }
protected void Reset() { var analyticsService = Substitute.For <IAnalyticsService>(); var lastTimeUsageStorage = Substitute.For <ILastTimeUsageStorage>(); var timeService = Substitute.For <ITimeService>(); Queue = new SyncStateQueue(); Transitions = new TransitionHandlerProvider(); Scheduler = new TestScheduler(); StateMachine = new StateMachine(Transitions, Scheduler, Substitute.For <ISubject <Unit> >()); EntryPoints = new StateMachineEntryPoints(); Orchestrator = new StateMachineOrchestrator(StateMachine, EntryPoints); SyncManager = new SyncManager(Queue, Orchestrator, analyticsService, lastTimeUsageStorage, timeService); }
public static void ConfigureTransitions( TransitionHandlerProvider transitions, ITogglDatabase database, ITogglApi api, ITogglDataSource dataSource, IRetryDelayService apiDelay, IScheduler scheduler, ITimeService timeService, StateMachineEntryPoints entryPoints, IObservable <Unit> delayCancellation) { configurePullTransitions(transitions, database, api, dataSource, timeService, scheduler, entryPoints.StartPullSync, delayCancellation); configurePushTransitions(transitions, database, api, dataSource, apiDelay, scheduler, entryPoints.StartPushSync, delayCancellation); }
public static void ConfigureTransitions( ITransitionConfigurator transitions, ITogglDatabase database, ITogglApi api, ITogglDataSource dataSource, IRetryDelayService apiDelay, IScheduler scheduler, ITimeService timeService, IAnalyticsService analyticsService, StateMachineEntryPoints entryPoints, IObservable <Unit> delayCancellation) { configurePullTransitions(transitions, database, api, dataSource, timeService, analyticsService, scheduler, entryPoints.StartPullSync, delayCancellation); configurePushTransitions(transitions, api, dataSource, analyticsService, apiDelay, scheduler, entryPoints.StartPushSync, delayCancellation); configureCleanUpTransitions(transitions, timeService, dataSource, entryPoints.StartCleanUp); }
public static ISyncManager CreateSyncManager( ITogglDatabase database, ITogglApi api, ITogglDataSource dataSource, ITimeService timeService, IScheduler scheduler) { var queue = new SyncStateQueue(); var entryPoints = new StateMachineEntryPoints(); var transitions = new TransitionHandlerProvider(); ConfigureTransitions(transitions, database, api, dataSource, scheduler, timeService, entryPoints); var stateMachine = new StateMachine(transitions, scheduler); var orchestrator = new StateMachineOrchestrator(stateMachine, entryPoints); return(new SyncManager(queue, orchestrator)); }
public static ISyncManager CreateSyncManager( ITogglDatabase database, ITogglApi api, ITogglDataSource dataSource, ITimeService timeService, IScheduler scheduler) { var queue = new SyncStateQueue(); var entryPoints = new StateMachineEntryPoints(); var transitions = new TransitionHandlerProvider(); var delayCancellation = new Subject <Unit>(); var delayCancellationObservable = delayCancellation.AsObservable().Replay(); ConfigureTransitions(transitions, database, api, dataSource, scheduler, timeService, entryPoints, delayCancellationObservable); var stateMachine = new StateMachine(transitions, scheduler, delayCancellation); var orchestrator = new StateMachineOrchestrator(stateMachine, entryPoints); return(new SyncManager(queue, orchestrator)); }
public static void ConfigureTransitions( ITransitionConfigurator transitions, ITogglDatabase database, ITogglApi api, ITogglDataSource dataSource, IScheduler scheduler, ITimeService timeService, IAnalyticsService analyticsService, StateMachineEntryPoints entryPoints, ISyncStateQueue queue) { var minutesLeakyBucket = new LeakyBucket(timeService, slotsPerWindow: 60, movingWindowSize: TimeSpan.FromSeconds(60)); var secondsLeakyBucket = new LeakyBucket(timeService, slotsPerWindow: 3, movingWindowSize: TimeSpan.FromSeconds(1)); var rateLimiter = new RateLimiter(secondsLeakyBucket, scheduler); configurePullTransitions(transitions, database, api, dataSource, timeService, analyticsService, scheduler, entryPoints.StartPullSync, minutesLeakyBucket, rateLimiter, queue); configurePushTransitions(transitions, api, dataSource, analyticsService, minutesLeakyBucket, rateLimiter, scheduler, entryPoints.StartPushSync); configureCleanUpTransitions(transitions, timeService, dataSource, analyticsService, entryPoints.StartCleanUp); }
public static ISyncManager CreateSyncManager( ITogglDatabase database, ITogglApi api, ITogglDataSource dataSource, ITimeService timeService, IAnalyticsService analyticsService, ILastTimeUsageStorage lastTimeUsageStorage, IScheduler scheduler, IAutomaticSyncingService automaticSyncingService) { var queue = new SyncStateQueue(); var entryPoints = new StateMachineEntryPoints(); var transitions = new TransitionHandlerProvider(analyticsService); ConfigureTransitions(transitions, database, api, dataSource, scheduler, timeService, analyticsService, lastTimeUsageStorage, entryPoints, queue); var stateMachine = new StateMachine(transitions, scheduler); var orchestrator = new StateMachineOrchestrator(stateMachine, entryPoints); return(new SyncManager(queue, orchestrator, analyticsService, lastTimeUsageStorage, timeService, automaticSyncingService)); }
private static TestConfigurator configureTogglSyncGraph() { var configurator = new TestConfigurator(); var entryPoints = new StateMachineEntryPoints(); configurator.AllDistinctStatesInOrder.Add(entryPoints); TogglSyncManager.ConfigureTransitions( configurator, Substitute.For <ITogglDatabase>(), Substitute.For <ITogglApi>(), Substitute.For <ITogglDataSource>(), Substitute.For <IScheduler>(), Substitute.For <ITimeService>(), Substitute.For <IAnalyticsService>(), entryPoints, Substitute.For <ISyncStateQueue>() ); return(configurator); }
public static ISyncManager CreateSyncManager( ITogglDatabase database, ITogglApi api, ITogglDataSource dataSource, ITimeService timeService, IAnalyticsService analyticsService, ILastTimeUsageStorage lastTimeUsageStorage, TimeSpan?retryLimit, IScheduler scheduler) { var random = new Random(); var queue = new SyncStateQueue(); var entryPoints = new StateMachineEntryPoints(); var transitions = new TransitionHandlerProvider(); var apiDelay = new RetryDelayService(random, retryLimit); var delayCancellation = new Subject <Unit>(); var delayCancellationObservable = delayCancellation.AsObservable().Replay(); ConfigureTransitions(transitions, database, api, dataSource, apiDelay, scheduler, timeService, analyticsService, entryPoints, delayCancellationObservable); var stateMachine = new StateMachine(transitions, scheduler, delayCancellation); var orchestrator = new StateMachineOrchestrator(stateMachine, entryPoints); return(new SyncManager(queue, orchestrator, analyticsService, lastTimeUsageStorage, timeService)); }