Example #1
0
        public async Task SimpleRequestQueueTest()
        {
            MockLayoutManager layoutManager = new MockLayoutManager();

            layoutManager.FindOneAction = true;
            IResolver resolver = new Resolver(false);

            ServiceManager.ReadOnlyForTests = false;
            ServiceManager.LayoutManager    = layoutManager;
            ServiceManager.ReadOnlyForTests = true;

            TaskCompletionSource <ResolvedActionsEventArgs> requestReady = new TaskCompletionSource <ResolvedActionsEventArgs>();

            resolver.ActionsResolved += (sender, args) =>
            {
                requestReady.TrySetResult(args);
            };
            await resolver.CreateRequest(new BeaconEventArgs()
            {
                Beacon = new Beacon()
                {
                    Id1 = "7367672374000000ffff0000ffff0004", Id2 = 39178, Id3 = 30929
                },
                EventType = BeaconEventType.Unknown
            });

            ResolvedActionsEventArgs state = await requestReady.Task;

            Assert.AreEqual(1, state.ResolvedActions.Count, "Request not successfull");
        }
Example #2
0
        public async Task EventHistory_FlushHistory()
        {
            var beacon = new Beacon();

            beacon.Id1       = "7367672374000000ffff0000ffff0007";
            beacon.Id2       = 8008;
            beacon.Id3       = 5;
            beacon.Timestamp = DateTimeOffset.Now;
            var args = new BeaconEventArgs();

            args.Beacon    = beacon;
            args.EventType = BeaconEventType.Exit;
            var resolvedActionEventArgs = new ResolvedActionsEventArgs()
            {
                BeaconPid = beacon.Pid, BeaconEventType = BeaconEventType.Enter
            };

            BeaconAction beaconaction1 = new BeaconAction()
            {
                Body = "body", Url = "http://www.com", Uuid = "1223"
            };
            BeaconAction beaconaction2 = new BeaconAction()
            {
                Body = "body", Url = "http://www.com", Uuid = "5678"
            };
            BeaconAction beaconaction3 = new BeaconAction()
            {
                Body = "body", Url = "http://www.com", Uuid = "9678"
            };
            ResolvedAction res1 = new ResolvedAction()
            {
                SuppressionTime = 100, SendOnlyOnce = true, BeaconAction = beaconaction1
            };
            ResolvedAction res2 = new ResolvedAction()
            {
                SuppressionTime = 100, SendOnlyOnce = true, BeaconAction = beaconaction2
            };
            ResolvedAction res3 = new ResolvedAction()
            {
                SuppressionTime = 1, SendOnlyOnce = true, BeaconAction = beaconaction3
            };

            EventHistory eventHistory = new EventHistory();

            await eventHistory.SaveBeaconEventAsync(args, null);

            await eventHistory.SaveExecutedResolvedActionAsync(resolvedActionEventArgs, beaconaction1);

            await eventHistory.SaveExecutedResolvedActionAsync(resolvedActionEventArgs, beaconaction3);

            await eventHistory.FlushHistoryAsync();
        }
 /// <summary>
 /// Stores a resolved and executed action to the database.
 /// </summary>
 public async Task SaveExecutedResolvedActionAsync(ResolvedActionsEventArgs eventArgs, BeaconAction beaconAction)
 {
     await ServiceManager.StorageService.SaveHistoryAction(beaconAction.Uuid, eventArgs.BeaconPid, DateTime.Now, eventArgs.BeaconEventType, eventArgs.Location);
 }
Example #4
0
        public async Task EventHistory_ShouldSupress()
        {
            var beacon = new Beacon();

            beacon.Id1       = "7367672374000000ffff0000ffff0007";
            beacon.Id2       = 8008;
            beacon.Id3       = 5;
            beacon.Timestamp = DateTimeOffset.Now;
            var args = new BeaconEventArgs();

            args.Beacon    = beacon;
            args.EventType = BeaconEventType.Exit;
            var resolvedActionEventArgs = new ResolvedActionsEventArgs()
            {
                BeaconPid = beacon.Pid, BeaconEventType = BeaconEventType.Enter
            };

            BeaconAction beaconaction1 = new BeaconAction()
            {
                Body = "body", Url = "http://www.com", Uuid = "1223"
            };
            BeaconAction beaconaction2 = new BeaconAction()
            {
                Body = "body", Url = "http://www.com", Uuid = "5678"
            };
            BeaconAction beaconaction3 = new BeaconAction()
            {
                Body = "body", Url = "http://www.com", Uuid = "9678"
            };
            ResolvedAction res1 = new ResolvedAction()
            {
                SuppressionTime = 100, SendOnlyOnce = true, BeaconAction = beaconaction1
            };
            ResolvedAction res2 = new ResolvedAction()
            {
                SuppressionTime = 100, SendOnlyOnce = true, BeaconAction = beaconaction2
            };
            ResolvedAction res3 = new ResolvedAction()
            {
                SuppressionTime = 1, SendOnlyOnce = true, BeaconAction = beaconaction3
            };

            EventHistory eventHistory = new EventHistory();

            await eventHistory.SaveBeaconEventAsync(args, null);

            await eventHistory.SaveExecutedResolvedActionAsync(resolvedActionEventArgs, beaconaction1);

            await eventHistory.SaveExecutedResolvedActionAsync(resolvedActionEventArgs, beaconaction3);

            eventHistory.ShouldSupressAsync(res1);
            eventHistory.ShouldSupressAsync(res3);

            await Task.Delay(2000);


            bool shouldSupress1 = eventHistory.ShouldSupressAsync(res1);
            bool shouldSupress2 = eventHistory.ShouldSupressAsync(res2);
            bool shouldSupress3 = eventHistory.ShouldSupressAsync(res3);

            Assert.IsTrue(shouldSupress1);
            Assert.IsFalse(shouldSupress2);
            Assert.IsFalse(shouldSupress3); //Supression time should be over
        }
Example #5
0
        private async Task Resolve(Request request)
        {
            Logger.Trace("take next request " + request?.RequestId + " "+request?.BeaconEventArgs.EventType);
            if (request == null)
            {
                FailedToResolveActions?.Invoke(this, "request is null");
                return;
            }
            request.TryCount++;

            if (request.BeaconEventArgs.EventType == BeaconEventType.Unknown)
            {
                request.BeaconEventArgs.EventType = BeaconManager.ResolveBeaconState(request.BeaconEventArgs.Beacon);
            }
            Logger.Trace("request resolved " + request.BeaconEventArgs.EventType);

            if (request.BeaconEventArgs.EventType == BeaconEventType.None)
            {
                return;
            }

            if (request.BeaconEventArgs.EventType == BeaconEventType.Enter && EventHistory != null)
            {
                await EventHistory.SaveBeaconEventAsync(request.BeaconEventArgs, request.BeaconEventArgs.Location);
            }


            RequestResultState requestResult = RequestResultState.Failed;

            try
            {
                Logger.Debug("LayoutManager.InternalExecuteRequestAsync(): Request ID is " + request.RequestId);

                if (request.BeaconEventArgs?.Beacon != null && await ServiceManager.LayoutManager.VerifyLayoutAsync() && ServiceManager.LayoutManager.Layout != null)
                {
                    request.ResolvedActions = ServiceManager.LayoutManager.Layout.GetResolvedActionsForPidAndEvent(request);

                    foreach (ResolvedAction resolvedAction in request.ResolvedActions)
                    {
                        if (resolvedAction != null && resolvedAction.BeaconAction != null)
                        {
                            resolvedAction.BeaconAction.Id = request.RequestId;
                        }
                    }

                    requestResult = RequestResultState.Success;
                }
            }
            catch (ArgumentNullException ex)
            {
                request.ErrorMessage = ex.Message;
                requestResult = RequestResultState.Failed;
            }
            catch (Exception ex)
            {
                request.ErrorMessage = ex.Message;
                requestResult = RequestResultState.Failed;
            }
            Logger.Debug("request result " + request.RequestId + " " + requestResult);

            switch (requestResult)
            {
                case RequestResultState.Failed:
                {
                    if (request.TryCount >= request.MaxNumberOfRetries)
                    {
                        Logger.Info("OnRequestServed: Request with ID " + request.RequestId + " failed");

                        FailedToResolveActions?.Invoke(this, request.ErrorMessage);
                    }
                    else
                    {
                        int numberOfTriesLeft = request.MaxNumberOfRetries - request.TryCount;

                        Logger.Debug("RequestQueue.ServeNextRequestAsync(): Request with ID "
                                     + request.RequestId + " failed, will try "
                                     + numberOfTriesLeft + " more " + (numberOfTriesLeft > 1 ? "times" : "time"));

                        await Resolve(request);
                    }

                    break;
                }
                case RequestResultState.Success:
                {
                    if (ActionsResolved != null)
                    {
                        ResolvedActionsEventArgs eventArgs = new ResolvedActionsEventArgs();
                        eventArgs.ResolvedActions = request.ResolvedActions;
                        eventArgs.RequestId = request.RequestId;
                        eventArgs.BeaconEventType = request.BeaconEventArgs.EventType;
                        eventArgs.Location = await ServiceManager.LocationService.GetGeoHashedLocation();
                        if (request.BeaconEventArgs != null && request.BeaconEventArgs.Beacon != null)
                        {
                            eventArgs.BeaconPid = request.BeaconEventArgs.Beacon.Pid;
                        }

                        ActionsResolved(this, eventArgs);
                    }
                    break;
                }
            }
        }
Example #6
0
 private void Res_ActionResolved(object sender, ResolvedActionsEventArgs e)
 {
     _e = e;
     _manualEvent.Set();
 }
        private async Task Resolve(Request request)
        {
            Logger.Trace("take next request " + request?.RequestId + " " + request?.BeaconEventArgs.EventType);
            if (request == null)
            {
                FailedToResolveActions?.Invoke(this, "request is null");
                return;
            }
            request.TryCount++;

            if (request.BeaconEventArgs.EventType == BeaconEventType.Unknown)
            {
                request.BeaconEventArgs.EventType = BeaconManager.ResolveBeaconState(request.BeaconEventArgs.Beacon);
            }
            Logger.Trace("request resolved " + request.BeaconEventArgs.EventType);

            if (request.BeaconEventArgs.EventType == BeaconEventType.None)
            {
                return;
            }

            if (request.BeaconEventArgs.EventType == BeaconEventType.Enter && EventHistory != null)
            {
                await EventHistory.SaveBeaconEventAsync(request.BeaconEventArgs, request.BeaconEventArgs.Location);
            }


            RequestResultState requestResult = RequestResultState.Failed;

            try
            {
                Logger.Debug("LayoutManager.InternalExecuteRequestAsync(): Request ID is " + request.RequestId);

                if (request.BeaconEventArgs?.Beacon != null && await ServiceManager.LayoutManager.VerifyLayoutAsync() && ServiceManager.LayoutManager.Layout != null)
                {
                    request.ResolvedActions = ServiceManager.LayoutManager.Layout.GetResolvedActionsForPidAndEvent(request);

                    foreach (ResolvedAction resolvedAction in request.ResolvedActions)
                    {
                        if (resolvedAction != null && resolvedAction.BeaconAction != null)
                        {
                            resolvedAction.BeaconAction.Id = request.RequestId;
                        }
                    }

                    requestResult = RequestResultState.Success;
                }
            }
            catch (ArgumentNullException ex)
            {
                request.ErrorMessage = ex.Message;
                requestResult        = RequestResultState.Failed;
            }
            catch (Exception ex)
            {
                request.ErrorMessage = ex.Message;
                requestResult        = RequestResultState.Failed;
            }
            Logger.Debug("request result " + request.RequestId + " " + requestResult);

            switch (requestResult)
            {
            case RequestResultState.Failed:
            {
                if (request.TryCount >= request.MaxNumberOfRetries)
                {
                    Logger.Info("OnRequestServed: Request with ID " + request.RequestId + " failed");

                    FailedToResolveActions?.Invoke(this, request.ErrorMessage);
                }
                else
                {
                    int numberOfTriesLeft = request.MaxNumberOfRetries - request.TryCount;

                    Logger.Debug("RequestQueue.ServeNextRequestAsync(): Request with ID "
                                 + request.RequestId + " failed, will try "
                                 + numberOfTriesLeft + " more " + (numberOfTriesLeft > 1 ? "times" : "time"));

                    await Resolve(request);
                }

                break;
            }

            case RequestResultState.Success:
            {
                if (ActionsResolved != null)
                {
                    ResolvedActionsEventArgs eventArgs = new ResolvedActionsEventArgs();
                    eventArgs.ResolvedActions = request.ResolvedActions;
                    eventArgs.RequestId       = request.RequestId;
                    eventArgs.BeaconEventType = request.BeaconEventArgs.EventType;
                    eventArgs.Location        = await ServiceManager.LocationService.GetGeoHashedLocation();

                    if (request.BeaconEventArgs != null && request.BeaconEventArgs.Beacon != null)
                    {
                        eventArgs.BeaconPid = request.BeaconEventArgs.Beacon.Pid;
                    }

                    ActionsResolved(this, eventArgs);
                }
                break;
            }
            }
        }
Example #8
0
 /// <summary>
 /// Stores a resolved and executed action to the database.
 /// </summary>
 public async Task SaveExecutedResolvedActionAsync(ResolvedActionsEventArgs eventArgs, BeaconAction beaconAction)
 {
     await ServiceManager.StorageService.SaveHistoryAction(beaconAction.Uuid, eventArgs.BeaconPid, DateTime.Now, eventArgs.BeaconEventType, eventArgs.Location);
 }