コード例 #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 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);
                    }
                }
        }
コード例 #3
0
        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();
            });
        }