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(); }); }
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}" })); } }
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() })); }