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