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