Exemple #1
0
        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) })
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }