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