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); }
private void ConfigureMocks(TestConsumer consumer) { var depositId = consumer.DepositId; _consumerRepository.GetAsync(depositId).Returns(consumer.Consumer); _paymentClaimRepository.BrowseAsync(Arg.Any <GetPaymentClaims>()) .Returns(PagedResult <PaymentClaim> .Empty); _sessionRepository.BrowseAsync(new GetProviderSessions { DepositId = depositId }) .Returns(PagedResult <ProviderSession> .Create(new List <ProviderSession>(consumer.Sessions), 1, 1, 1, 1)); _receiptsPolicies.CanRequestReceipts(Arg.Any <long>(), Arg.Any <UInt256>()).Returns(true); _sessionManager.GetConsumerNodes(depositId).Returns(consumer.Nodes.Select(n => n.Node).ToArray()); _receiptProcessor.TryProcessAsync(Arg.Any <ProviderSession>(), _consumer, Arg.Any <INdmProviderPeer>(), Arg.Any <DataDeliveryReceiptRequest>(), Arg.Any <DataDeliveryReceipt>()).Returns(true); }
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); } }