예제 #1
0
        public void Setup()
        {
            _depositNodesHandlerFactory = Substitute.For <IDepositNodesHandlerFactory>();
            _sessionManager             = Substitute.For <ISessionManager>();
            _receiptsPolicies           = Substitute.For <IReceiptsPolicies>();
            _receiptProcessor           = Substitute.For <IReceiptProcessor>();
            _paymentClaimProcessor      = Substitute.For <IPaymentClaimProcessor>();
            _consumerRepository         = Substitute.For <IConsumerRepository>();
            _paymentClaimRepository     = Substitute.For <IPaymentClaimRepository>();
            _sessionRepository          = Substitute.For <IProviderSessionRepository>();
            _sessionRepository.BrowseAsync(Arg.Any <GetProviderSessions>()).Returns(PagedResult <ProviderSession> .Empty);
            _receiptRepository = Substitute.For <IReceiptRepository>();
            var unixTime = UnixTime.FromSeconds(100);

            _timestamper = Substitute.For <ITimestamper>();
            _timestamper.UnixTime.Returns(unixTime);
            _gasPriceService     = Substitute.For <IGasPriceService>();
            _logManager          = Substitute.For <ILogManager>();
            _wallet              = Substitute.For <IWallet>();
            _address             = Address.Zero;
            _consumer            = Address.Zero;
            _depositNodesHandler = new InMemoryDepositNodesHandler(Keccak.Zero, _consumer, DataAssetUnitType.Unit, 0,
                                                                   100, 0,
                                                                   0, 0, 0, 0, 0, 0, null, null, 0);
            _depositNodesHandlerFactory.CreateInMemory(Arg.Any <Keccak>(), _consumer, Arg.Any <DataAssetUnitType>(),
                                                       Arg.Any <uint>(), Arg.Any <uint>(), Arg.Any <UInt256>(), Arg.Any <uint>(), Arg.Any <uint>(), Arg.Any <uint>(),
                                                       Arg.Any <uint>(), Arg.Any <uint>(), Arg.Any <uint>(), Arg.Any <PaymentClaim>(),
                                                       Arg.Any <IEnumerable <DataDeliveryReceiptDetails> >(), Arg.Any <uint>()).Returns(_depositNodesHandler);
            _depositManager = new DepositManager(_depositNodesHandlerFactory, _sessionManager, _receiptsPolicies,
                                                 _wallet, _address, _receiptProcessor, _paymentClaimProcessor, _consumerRepository,
                                                 _paymentClaimRepository, _receiptRepository, _sessionRepository, _timestamper, _gasPriceService,
                                                 _logManager);
        }
예제 #2
0
        public async Task will_calculate_units_correctly_when_unit_type_is_time()
        {
            var          depositId = Keccak.Zero;
            TestConsumer consumer  = TestConsumer.ForDeposit(depositId, DataAssetUnitType.Time)
                                     .WithNode(1).AddSession().WithUnpaidUnits(10).WithConsumedUnits(30)
                                     .And.Build();

            ConfigureMocks(consumer);

            var depositNodesHandler = new InMemoryDepositNodesHandler(Keccak.Zero,
                                                                      _consumer,
                                                                      DataAssetUnitType.Time,
                                                                      1,
                                                                      100,
                                                                      1,
                                                                      60,
                                                                      50,
                                                                      30,
                                                                      50,
                                                                      0,
                                                                      0,
                                                                      null,
                                                                      null,
                                                                      0);

            _depositNodesHandlerFactory.CreateInMemory(depositId,
                                                       Arg.Any <Address>(),
                                                       DataAssetUnitType.Time, Arg.Any <uint>(),
                                                       Arg.Any <uint>(), Arg.Any <UInt256>(), Arg.Any <uint>(),
                                                       Arg.Any <uint>(),
                                                       Arg.Any <uint>(),
                                                       Arg.Any <uint>(),
                                                       Arg.Any <uint>(),
                                                       Arg.Any <uint>(),
                                                       Arg.Any <PaymentClaim>(),
                                                       Arg.Any <IEnumerable <DataDeliveryReceiptDetails> >(),
                                                       Arg.Any <uint>())
            .Returns(depositNodesHandler);

            IDepositNodesHandler depositHandler = await _depositManager.InitAsync(depositId);

            await _depositManager.HandleConsumedUnitAsync(depositId);

            Assert.IsTrue(depositHandler.ConsumedUnits == 99);
            Assert.IsTrue(depositHandler.UnpaidUnits == 79);
            Assert.IsTrue(depositHandler.UnclaimedUnits == 89);
            Assert.IsTrue(depositHandler.UnmergedUnits == 69);
        }
예제 #3
0
        public async Task <IDepositNodesHandler> InitAsync(Keccak depositId, uint unpaidSessionUnits = 0)
        {
            if (_logger.IsInfo)
            {
                _logger.Info($"Initializing deposit: '{depositId}'.");
            }

            Consumer?consumer = await _consumerRepository.GetAsync(depositId);

            if (consumer is null)
            {
                if (_logger.IsInfo)
                {
                    _logger.Info($"Consumer has not been found for deposit: '{depositId}'.");
                }

                return(null);
            }

            if (_depositNodesHandlers.TryGetValue(depositId, out IDepositNodesHandler? deposit))
            {
                deposit.AddUnpaidUnits(unpaidSessionUnits);
                deposit.AddUnmergedUnits(unpaidSessionUnits);
                deposit.AddUnclaimedUnits(unpaidSessionUnits);

                if (_logger.IsInfo)
                {
                    _logger.Info($"Updated deposit: '{depositId}'.");
                }

                if (_logger.IsInfo)
                {
                    _logger.Info($"Deposit: '{depositId}' has {deposit.UnpaidUnits} unpaid units, unmerged: {deposit.UnmergedUnits}, unclaimed: {deposit.UnclaimedUnits}, grace: {deposit.GraceUnits}.");
                }

                return(deposit);
            }
            else
            {
                uint    purchasedUnits = consumer.DataRequest.Units;
                UInt256 unitPrice      = consumer.DataAsset.UnitPrice;
                var     sessions       = await _sessionRepository.BrowseAsync(new GetProviderSessions
                {
                    DepositId = depositId,
                    Results   = int.MaxValue
                });

                var depositReceipts = await _receiptRepository.BrowseAsync(depositId);

                var receipts = depositReceipts.OrderBy(r => r.Timestamp)
                               .ThenBy(r => r.Request.UnitsRange.To)
                               .ThenByDescending(r => r.Request.UnitsRange.From)
                               .ToArray();

                uint consumedUnits = (uint)sessions.Items.Sum(s => s.ConsumedUnits);
                uint graceUnits    = (uint)sessions.Items.Sum(s => s.GraceUnits);
                uint unpaidUnits   = (uint)(sessions.Items.Sum(s => s.UnpaidUnits) -
                                            sessions.Items.Sum(s => s.SettledUnits));

                ulong latestMergedReceiptTimestamp = receipts.LastOrDefault(r => r.IsMerged)?.Timestamp ?? 0;

                uint unmergedUnits = (uint)receipts.Where(r => !r.IsClaimed && !r.IsMerged &&
                                                          r.Timestamp >= latestMergedReceiptTimestamp)
                                     .Sum(r => r.Request.UnitsRange.To - r.Request.UnitsRange.From + 1);

                ulong latestClaimedReceiptTimestamp = receipts.LastOrDefault(r => r.IsClaimed)?.Timestamp ?? 0;

                uint unclaimedUnits = (uint)receipts.Where(r => !r.IsClaimed && !r.IsMerged &&
                                                           r.Timestamp >= latestClaimedReceiptTimestamp)
                                      .Sum(r => r.Request.UnitsRange.To - r.Request.UnitsRange.From + 1);

                var  latestReceipts             = receipts.Where(r => r.Timestamp >= latestClaimedReceiptTimestamp);
                uint latestReceiptRequestNumber = receipts.Any() ? receipts.Max(r => r.Number) : 0;
                var  paymentClaimsResult        = await _paymentClaimRepository.BrowseAsync(new GetPaymentClaims
                {
                    DepositId = depositId,
                    Page      = 1,
                    Results   = int.MaxValue
                });

                PaymentClaim latestPaymentClaim = paymentClaimsResult.Items.OrderBy(c => c.Timestamp)
                                                  .ThenBy(c => c.UnitsRange.To).LastOrDefault();

                deposit = _depositNodesHandlerFactory.CreateInMemory(depositId, consumer.DataRequest.Consumer,
                                                                     consumer.DataAsset.UnitType, consumer.VerificationTimestamp, purchasedUnits, unitPrice,
                                                                     consumedUnits, unpaidUnits, unmergedUnits, unclaimedUnits, graceUnits,
                                                                     consumer.DataRequest.ExpiryTime, latestPaymentClaim, latestReceipts, latestReceiptRequestNumber);
                _depositNodesHandlers.TryAdd(depositId, deposit);
                if (_logger.IsInfo)
                {
                    _logger.Info($"Initialized deposit: '{depositId}'.");
                }

                if (_logger.IsInfo)
                {
                    _logger.Info($"Deposit: '{depositId}' has {deposit.UnpaidUnits} unpaid units, unmerged: {deposit.UnmergedUnits}, unclaimed: {deposit.UnclaimedUnits}, grace: {deposit.GraceUnits}.");
                }

                return(deposit);
            }
        }