public async Task When_Called_By_Multiple_Gateways_Should_Return_Closest() { var devEUI = Guid.NewGuid().ToString(); const uint fcntUp = 1; var req1 = new FunctionBundlerRequest() { GatewayId = "gateway1", ClientFCntUp = fcntUp, Rssi = -180 }; var pipeline1 = new FunctionBundlerPipelineExecuter(new IFunctionBundlerExecutionItem[] { this.preferredGatewayExecutionItem }, devEUI, req1); var t1 = Task.Run(() => this.preferredGatewayExecutionItem.ExecuteAsync(pipeline1)); var req2 = new FunctionBundlerRequest() { GatewayId = "gateway2", ClientFCntUp = fcntUp, Rssi = -179 }; var pipeline2 = new FunctionBundlerPipelineExecuter(new IFunctionBundlerExecutionItem[] { this.preferredGatewayExecutionItem }, devEUI, req2); var t2 = Task.Run(() => this.preferredGatewayExecutionItem.ExecuteAsync(pipeline2)); var req3 = new FunctionBundlerRequest() { GatewayId = "gateway3", ClientFCntUp = fcntUp, Rssi = -39 }; var pipeline3 = new FunctionBundlerPipelineExecuter(new IFunctionBundlerExecutionItem[] { this.preferredGatewayExecutionItem }, devEUI, req3); var t3 = Task.Run(() => this.preferredGatewayExecutionItem.ExecuteAsync(pipeline3)); await Task.WhenAll(t1, t2, t3); foreach (var reqAndPipeline in new[] { (t1, pipeline1), (t2, pipeline2), (t3, pipeline3) })
private async Task <FunctionBundlerResult> ExecuteRequest(DevEui devEUI, FunctionBundlerRequest req) { var result = await this.functionBundler.HandleFunctionBundlerInvoke(devEUI, req); lock (req) { req.ClientFCntUp++; if (req.AdrRequest != null) { req.AdrRequest.FCntUp++; Assert.Equal(req.AdrRequest.FCntUp, req.ClientFCntUp); } if (result.NextFCntDown.HasValue) { req.ClientFCntDown = result.NextFCntDown.Value; if (req.AdrRequest != null) { req.AdrRequest.FCntDown = req.ClientFCntDown; } } } return(result); }
public async Task FunctionBundler_Multi() { var gatewayId1 = NewUniqueEUI64(); var gatewayId2 = NewUniqueEUI64(); var gatewayId3 = NewUniqueEUI64(); var gatewayId4 = NewUniqueEUI64(); var devEUI = TestEui.GenerateDevEui(); var requests = new FunctionBundlerRequest[] { CreateStandardBundlerRequest(gatewayId1), CreateStandardBundlerRequest(gatewayId2), CreateStandardBundlerRequest(gatewayId3), CreateStandardBundlerRequest(gatewayId4) }; foreach (var req in requests) { await PrepareADRFrames(devEUI, 20, req.AdrRequest); req.ClientFCntUp = req.AdrRequest.FCntUp; req.ClientFCntDown = req.AdrRequest.FCntDown; } var functionBundlerResults = await Task.WhenAll(from req in requests select ExecuteRequest(devEUI, req)); // only one request should be winning the race var winners = 0; var dups = 0; foreach (var res in functionBundlerResults) { if (!res.DeduplicationResult.IsDuplicate) { Assert.NotNull(res.AdrResult); Assert.True(res.AdrResult.CanConfirmToDevice); Assert.Equal(res.AdrResult.FCntDown, res.NextFCntDown); Assert.True(res.NextFCntDown.GetValueOrDefault() > 0); winners++; } else { Assert.NotNull(res.AdrResult); Assert.False(res.AdrResult.CanConfirmToDevice); Assert.Equal(0U, res.AdrResult.FCntDown.GetValueOrDefault()); Assert.Null(res.NextFCntDown); dups++; } } Assert.Equal(1, winners); Assert.Equal(functionBundlerResults.Length - 1, dups); }
public async Task FunctionBundler_Multi() { var gatewayId1 = NewUniqueEUI64(); var gatewayId2 = NewUniqueEUI64(); var gatewayId3 = NewUniqueEUI64(); var gatewayId4 = NewUniqueEUI64(); var devEUI = NewUniqueEUI64(); var requests = new FunctionBundlerRequest[] { CreateStandardBundlerRequest(gatewayId1), CreateStandardBundlerRequest(gatewayId2), CreateStandardBundlerRequest(gatewayId3), CreateStandardBundlerRequest(gatewayId4) }; foreach (var req in requests) { await this.PrepareADRFrames(devEUI, 20, req.AdrRequest); req.ClientFCntUp = req.AdrRequest.FCntUp; req.ClientFCntDown = req.AdrRequest.FCntDown; } var tasks = new List <Task>(requests.Length); var functionBundlerResults = new List <FunctionBundlerResult>(requests.Length); foreach (var req in requests) { // functionBundlerResults.Add(await ExecuteRequest(devEUI, req)); tasks.Add(Task.Run(async() => { functionBundlerResults.Add(await this.ExecuteRequest(devEUI, req)); })); } Task.WaitAll(tasks.ToArray()); // only one request should be winning the race var winners = 0; var dups = 0; foreach (var res in functionBundlerResults) { if (!res.DeduplicationResult.IsDuplicate) { Assert.NotNull(res.AdrResult); Assert.True(res.AdrResult.CanConfirmToDevice); Assert.Equal(res.AdrResult.FCntDown, res.NextFCntDown); Assert.True(res.NextFCntDown.GetValueOrDefault() > 0); winners++; } else { Assert.NotNull(res.AdrResult); Assert.False(res.AdrResult.CanConfirmToDevice); Assert.Equal(0U, res.AdrResult.FCntDown); Assert.Null(res.NextFCntDown); dups++; } } Assert.Equal(1, winners); Assert.Equal(requests.Length - 1, dups); }