コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
 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);
 }
コード例 #4
0
 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);
 }
コード例 #5
0
            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);
            }
コード例 #6
0
 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);
 }
コード例 #7
0
 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);
 }
コード例 #8
0
        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));
        }
コード例 #9
0
        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));
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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));
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        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));
        }