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 void PhaseChanges_Should_Be_Synchronised_Across_Instances() { var secondProviderStartOffset = CycleConfiguration.Default.CycleDuration.Divide(3); _testScheduler.AdvanceBy(secondProviderStartOffset.Ticks); var spy2 = Substitute.For <IObserver <IPhase> >(); using (var cycleProvider2 = new CycleEventsProvider(CycleConfiguration.Default, _dateTimeProvider, _schedulerProvider, _deltaHashProvider, new Abstractions.Sync.SyncState() { IsSynchronized = true }, _logger)) using (cycleProvider2.PhaseChanges.Take(50 - PhaseCountPerCycle) .Subscribe(p => { TestContext.WriteLine( $"{_stopWatch.Elapsed.TotalSeconds.ToString(CultureInfo.InvariantCulture)} % 2 -- {p}"); spy2.OnNext(p); }, () => { TestContext.WriteLine( // ReSharper disable once InterpolatedStringExpressionIsNotIFormattable $"% 2 -- completed after {_stopWatch.Elapsed.TotalSeconds.ToString(CultureInfo.InvariantCulture):g}"); spy2.OnCompleted(); })) { _testScheduler.Start(); _spy.Received(1).OnCompleted(); spy2.Received(1).OnCompleted(); var receivedPhases = GetReceivedPhases(_spy); receivedPhases.Count.Should().Be(50); var receivedPhases2 = GetReceivedPhases(spy2); receivedPhases2.Count.Should().Be(50 - PhaseCountPerCycle); (receivedPhases2.First().UtcStartTime - receivedPhases.First().UtcStartTime) .TotalMilliseconds.Should().BeApproximately( CycleConfiguration.Default.CycleDuration.TotalMilliseconds, 0.0002d, "the provider should start on the second cycle"); foreach (var phases in receivedPhases.Skip(PhaseCountPerCycle) .Zip(receivedPhases2, (a, b) => new Tuple <IPhase, IPhase>(a, b))) { (phases.Item1.UtcStartTime - phases.Item2.UtcStartTime).TotalMilliseconds .Should().BeApproximately(0, 0.0001d, "phases should be in sync"); phases.Item1.Name.Should().Be(phases.Item2.Name); phases.Item1.Status.Should().Be(phases.Item1.Status); } } }
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(); }); }