Пример #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();
            });
        }
Пример #2
0
        public async Task <JsonResult> GetLatestDeltaAsync(DateTime?asOf)
        {
            var latest = _deltaHashProvider.GetLatestDeltaHash(asOf?.ToUniversalTime());

            try
            {
                await using (var fullContentStream = await _dfsService.UnixFsApi.ReadFileAsync(latest).ConfigureAwait(false))
                {
                    var contentBytes = await fullContentStream.ReadAllBytesAsync(CancellationToken.None)
                                       .ConfigureAwait(false);

                    var delta = Delta.Parser.ParseFrom(contentBytes).ToDao <Delta, DeltaDao>(_mapperProvider);

                    return(Json(new
                    {
                        Success = true,
                        DeltaHash = latest,
                        Delta = delta
                    }));
                }
            }
            catch (Exception e)
            {
                _logger.Error(e, "Failed to find dfs content for delta as of {asOf} at {dfsTarget}", asOf, latest);
                return(Json(new
                {
                    Success = false,
                    Message = $"Failed to find dfs content for delta as of {asOf} at {latest}"
                }));
            }
        }
Пример #3
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();
            });
        }
        public async Task <JsonResult> GetLatestDelta(DateTime?asOf)
        {
            var latest    = _deltaHashProvider.GetLatestDeltaHash(asOf?.ToUniversalTime());
            var dfsTarget = latest.ToBase32();

            byte[] dfsContent = null;
            try
            {
                using (var fullContentStream = await _dfs.ReadAsync(dfsTarget))
                {
                    dfsContent = await fullContentStream.ReadAllBytesAsync(CancellationToken.None);
                }
            }
            catch (Exception e)
            {
                _logger.Error(e, "Failed to find dfs content for delta as of {asOf} at {dfsTarget}", asOf, dfsTarget);
            }

            return(Json(new
            {
                DeltaHash = dfsTarget,
                Base64UrlDfsContent = (dfsContent ?? new byte[0]).ToBase64Url()
            }));
        }