public void GetMergedTokenNetworkDeltas_WhenCalled_ReturnsCorrectlyMergedList(
            List <RaidenDelta> delta,
            RaidenSnapshot RaidenSnapshot,
            List <TokenNetworkDelta> expected)
        {
            var result = RaidenHelpers.GetMergedTokenNetworkDeltas(delta, RaidenSnapshot);

            Assert.That(result, Is.EquivalentTo(expected));
        }
예제 #2
0
        public static async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "v1/raiden/{timestamp}")] HttpRequest req,
            long timestamp,
            ILogger log)
        {
            var client = new MongoClient(MongoDbConnectionString);

            log.LogInformation($"{DateTime.UtcNow} INFO Retrievieng Nearest State.");
            var(nearestRaidenState, states) = await RetrieveNearestState(timestamp, client);

            if (RaidenHelpers.TimestampsAreClose(nearestRaidenState.Timestamp, timestamp))
            {
                log.LogInformation($"{DateTime.UtcNow} INFO A near enough state was already available.");
                return(new OkObjectResult(nearestRaidenState));
            }

            log.LogInformation($"{DateTime.UtcNow} INFO Computing Delta.");
            var(delta, aggregates) =
                await RaidenHelpers.RetrieveDelta <RaidenDelta>(
                    nearestRaidenState.Timestamp,
                    timestamp,
                    client,
                    DatabaseName,
                    RaidenAggregateCollection
                    );

            var raidenStates =
                nearestRaidenState
                .States
                .OrderByDescending(s => s.BlockNumber)
                .ToList();

            var howManyToRemove = delta.Count() - 1;
            var howManyToRetain = nearestRaidenState.States.Count() - delta.Count();

            // Remove unneded aggregates
            raidenStates.RemoveRange(howManyToRetain, howManyToRemove);
            raidenStates.AddRange(delta);

            nearestRaidenState.BlockNumber = delta.Max(x => x.BlockNumber);
            nearestRaidenState.Timestamp   = delta.Max(x => x.Timestamp);

            nearestRaidenState.TokenNetworks = RaidenHelpers.GetMergedTokenNetworkDeltas(delta, nearestRaidenState);

            nearestRaidenState.States = raidenStates;

            nearestRaidenState.MongoId = new ObjectId();

            log.LogInformation($"{DateTime.UtcNow} INFO Inserting newly computed state in database");
            // Could run in a separate Task
            await states.InsertOneAsync(nearestRaidenState);

            log.LogInformation($"{DateTime.UtcNow} INFO Returning computed state.");
            return(new OkObjectResult(nearestRaidenState));
        }