Ejemplo n.º 1
0
        public CycleEventsProviderTests(ITestOutputHelper output)
        {
            var hashProvider = new HashProvider(HashingAlgorithm.GetAlgorithmMetadata("blake2b-256"));

            _output        = output;
            _testScheduler = new TestScheduler();

            _schedulerProvider = Substitute.For <ICycleSchedulerProvider>();
            _schedulerProvider.Scheduler.Returns(_testScheduler);
            _dateTimeProvider  = Substitute.For <IDateTimeProvider>();
            _deltaHashProvider = Substitute.For <IDeltaHashProvider>();
            _logger            = Substitute.For <ILogger>();

            _deltaHashProvider.GetLatestDeltaHash(Arg.Any <DateTime>())
            .Returns(hashProvider.ComputeUtf8MultiHash("test"));

            _dateTimeProvider.UtcNow.Returns(_ => _testScheduler.Now.DateTime);
            _cycleProvider = new CycleEventsProvider(CycleConfiguration.Default, _dateTimeProvider, _schedulerProvider,
                                                     _deltaHashProvider, _logger);

            _spy = Substitute.For <IObserver <IPhase> >();

            _stopWatch = _testScheduler.StartStopwatch();

            _subscription = _cycleProvider.PhaseChanges.Take(50)
                            .Subscribe(p =>
            {
                _output.WriteLine($"{_stopWatch.Elapsed.TotalSeconds} -- {p}");
                _spy.OnNext(p);
            }, () =>
            {
                _output.WriteLine($"completed after {_stopWatch.Elapsed.TotalSeconds:g}");
                _spy.OnCompleted();
            });
        }
Ejemplo n.º 2
0
        public CycleEventsProvider(ICycleConfiguration configuration,
                                   IDateTimeProvider timeProvider,
                                   ICycleSchedulerProvider schedulerProvider,
                                   IDeltaHashProvider deltaHashProvider,
                                   SyncState syncState,
                                   ILogger logger)
        {
            _cancellationTokenSource = new CancellationTokenSource();

            Configuration = configuration;
            Scheduler     = schedulerProvider.Scheduler;

            var constructionStatusChanges = StatefulPhase.GetStatusChangeObservable(
                PhaseName.Construction, Configuration.Construction, Configuration.CycleDuration, Scheduler);

            var campaigningStatusChanges = StatefulPhase.GetStatusChangeObservable(
                PhaseName.Campaigning, Configuration.Campaigning, Configuration.CycleDuration, Scheduler);

            var votingStatusChanges = StatefulPhase.GetStatusChangeObservable(
                PhaseName.Voting, Configuration.Voting, Configuration.CycleDuration, Scheduler);

            var synchronisationStatusChanges = StatefulPhase.GetStatusChangeObservable(
                PhaseName.Synchronisation, Configuration.Synchronisation, Configuration.CycleDuration, Scheduler);

            _dateTimeProvider = timeProvider;
            var synchronisationOffset = GetTimeSpanUntilNextCycleStart();

            PhaseChanges = constructionStatusChanges
                           .Merge(campaigningStatusChanges, Scheduler)
                           .Merge(votingStatusChanges, Scheduler)
                           .Merge(synchronisationStatusChanges, Scheduler)
                           .Delay(synchronisationOffset, Scheduler)
                           .Where(x => syncState.IsSynchronized)
                           .Select(s => new Phase(deltaHashProvider.GetLatestDeltaHash(_dateTimeProvider.UtcNow), s.Name, s.Status, _dateTimeProvider.UtcNow))
                           .Do(p => logger.Debug("Current delta production phase {phase}", p),
                               exception => logger.Error(exception, "{PhaseChanges} stream failed and will stop producing cycle events.", nameof(PhaseChanges)),
                               () => logger.Debug("Stream {PhaseChanges} completed.", nameof(PhaseChanges)))
                           .TakeWhile(_ => !_cancellationTokenSource.IsCancellationRequested);
        }
        public void Init()
        {
            var hashProvider = new HashProvider(HashingAlgorithm.GetAlgorithmMetadata("keccak-256"));

            _output        = TestContext.CurrentContext;
            _testScheduler = new TestScheduler();

            _schedulerProvider = Substitute.For <ICycleSchedulerProvider>();
            _schedulerProvider.Scheduler.Returns(_testScheduler);
            _dateTimeProvider  = Substitute.For <IDateTimeProvider>();
            _deltaHashProvider = Substitute.For <IDeltaHashProvider>();
            _logger            = Substitute.For <ILogger>();

            _deltaHashProvider.GetLatestDeltaHash(Arg.Any <DateTime>())
            .Returns(hashProvider.ComputeUtf8MultiHash("test"));

            _dateTimeProvider.UtcNow.Returns(_ => _testScheduler.Now.DateTime);
            _cycleProvider = new CycleEventsProvider(CycleConfiguration.Default, _dateTimeProvider, _schedulerProvider,
                                                     _deltaHashProvider, new Abstractions.Sync.SyncState()
            {
                IsSynchronized = true
            }, _logger);

            _spy = Substitute.For <IObserver <IPhase> >();

            _stopWatch = _testScheduler.StartStopwatch();

            _subscription = _cycleProvider.PhaseChanges.Take(50)
                            .Subscribe(p =>
            {
                TestContext.WriteLine($"{_stopWatch.Elapsed.TotalSeconds} -- {p}");
                _spy.OnNext(p);
            }, () =>
            {
                TestContext.WriteLine($"completed after {_stopWatch.Elapsed.TotalSeconds:g}");
                _spy.OnCompleted();
            });
        }