Ejemplo n.º 1
0
        private async Task AdvanceActionWithState(IDeviceStateAction oldState)
        {
            IDeviceStateAction newState = stateActionController.GetNextAction(oldState);

            if (savedStackState.Count > 0)
            {
                newState.SetState(savedStackState.Pop());
            }

            oldState.Dispose();

            currentStateAction = newState;

            RaiseStateChange(oldState.WorkflowStateType, newState.WorkflowStateType);

            if (StateActionRules.NeedsDeviceRecovery)
            {
                if (currentStateAction.DoDeviceDiscovery())
                {
                    StateActionRules.NeedsDeviceRecovery = false;
                }
            }

            await newState.DoWork();
        }
Ejemplo n.º 2
0
 public async Task Error(IDeviceStateAction state)
 {
     if (state.WorkflowStateType == DeviceWorkflowState.None)
     {
         // TODO: Modify this workflow so that it follows the pattern and simply loops back around
         // to the same final state. In this way, we would run through Shutdown once and then simply
         // decide at that point to stop the workflow because we have no more states to advance to.
         StopWorkflow();
         RaiseOnWorkflowStopped(state.StopReason);
     }
     else
     {
         await AdvanceActionWithState(state);
     }
 }
Ejemplo n.º 3
0
        private async Task AdvanceStateActionTransition(IDeviceStateAction oldState)
        {
            IDeviceStateAction newState = stateActionController.GetNextAction(oldState);

            if (savedStackState.Count > 0)
            {
                newState.SetState(savedStackState.Pop());
            }

            oldState.Dispose();

            currentStateAction = newState;

            LogStateChange(oldState.WorkflowStateType, newState.WorkflowStateType);

            await newState.DoWork();
        }
        public void GetNextAction_ShouldReturnCorrectType_When_Called(Type expectedType, DeviceWorkflowState initialState, bool set = true, bool exception = false)
        {
            TestHelper.Helper.SetFieldValueToInstance <IDeviceStateAction>("currentStateAction", false, false, subject, null);

            if (set)
            {
                var map = TestHelper.Helper.GetFieldValueFromInstance <ReadOnlyDictionary <DeviceWorkflowState, Func <IDeviceStateController, IDeviceStateAction> > >(
                    "workflowMap", false, false, subject);

                IDeviceStateAction action = map[initialState](stubManager);

                if (exception)
                {
                    TestHelper.Helper.SetPropertyValueToInstance <StateException>("LastException", true, false, action, new StateException());
                }

                TestHelper.Helper.SetFieldValueToInstance <IDeviceStateAction>("currentStateAction", false, false, subject, action);
            }

            Assert.IsType(expectedType, subject.GetNextAction(initialState));
        }
 public DeviceStateMachineAsyncManager(ref Mock <IDeviceStateController> mockController, IDeviceStateAction stateAction)
     : this()
 {
     mockController.Setup(e => e.Complete(stateAction)).Callback(() => resetEvent.Set());
     mockController.Setup(e => e.Error(stateAction)).Callback(() => resetEvent.Set());
 }
Ejemplo n.º 6
0
 private void ExecuteFinalState()
 {
     using IDeviceStateAction lastAction = stateActionController.GetFinalState();
     lastAction.DoWork().Wait(2000);
 }
Ejemplo n.º 7
0
        //internal void PublishEventHandler(LinkEventResponse.EventTypeType eventType, LinkEventResponse.EventCodeType eventCode,
        //    List<LinkDeviceResponse> devices, LinkRequest request, string message)
        //{
        //    string sessionId = request.Actions?[0]?.SessionID;
        //    if (!string.IsNullOrWhiteSpace(sessionId))
        //    {
        //        try
        //        {
        //            var eventToPublish = ComposeEvent(sessionId, eventType, eventCode, devices, request, new List<string>() { (message ?? string.Empty) }, online: DALListenerIsOnline);
        //            string jsonToPublish = JsonConvert.SerializeObject(eventToPublish);
        //            Connector.Publish(jsonToPublish, new string[] { TopicOption.Event.ToString() });
        //        }
        //        catch (Exception xcp)
        //        {
        //            LoggingClient.LogErrorAsync(xcp.Message);
        //        }
        //    }
        //}

        //internal void PublishEventHandlerAsTask(LinkEventResponse.EventTypeType eventType, LinkEventResponse.EventCodeType eventCode,
        //    List<LinkDeviceResponse> devices, LinkRequest request, string message)
        //{
        //    _ = Task.Run(() => PublishEventHandler(eventType, eventCode, devices, request, message)).ConfigureAwait(false);
        //}

        //public LinkResponse ComposeEvent(string sessionId, LinkEventResponse.EventTypeType eventType,
        //    LinkEventResponse.EventCodeType eventCode, List<LinkDeviceResponse> devices, LinkRequest request, List<string> eventData,
        //    bool online = false)
        //{
        //    var eventResponse = new LinkResponse()
        //    {
        //        MessageID = request?.MessageID,
        //        Responses = new List<LinkActionResponse>(1)
        //         {
        //              new LinkActionResponse()
        //              {
        //                  MessageID = request.Actions?[0].MessageID,
        //                  DALResponse = new LinkDALResponse()
        //                   {
        //                        Devices = devices,
        //                        DALIdentifier = request?.Actions?[0].DALRequest?.DALIdentifier ?? DalIdentifier.GetDALIdentifier(),
        //                        OnlineStatus = online
        //                   },
        //                    EventResponse = new LinkEventResponse()
        //                    {
        //                         EventCode = eventCode.ToString(),
        //                         EventType = eventType.ToString(),
        //                         EventID = Guid.NewGuid(),
        //                         EventData = eventData == null ? null : eventData.ToArray(),
        //                         OrdinalID = 0
        //                     },
        //                    SessionResponse = new LinkSessionResponse()
        //                    {
        //                        SessionID = sessionId
        //                    }
        //               }
        //         }
        //    };

        //    if (eventResponse.Responses[0].DALResponse == null)
        //    {
        //        eventResponse.Responses[0].DALResponse = new LinkDALResponse();
        //    }
        //    if (eventResponse.Responses[0].DALResponse.DALIdentifier == null)
        //    {
        //        eventResponse.Responses[0].DALResponse.DALIdentifier = request.Actions?[0].LinkObjects?.ActionResponse?.DALResponse?.DALIdentifier;
        //    }
        //    if (eventResponse.Responses[0].DALResponse.Devices?[0] == null)
        //    {
        //        eventResponse.Responses[0].DALResponse.Devices = request.Actions?[0].LinkObjects?.ActionResponse?.DALResponse?.Devices ?? new List<LinkDeviceResponse>() { null };
        //    }

        //    return eventResponse;
        //}

        #region --- state machine management ---

        public Task Complete(IDeviceStateAction state) => AdvanceStateActionTransition(state);
Ejemplo n.º 8
0
 public async Task Recovery(IDeviceStateAction state, object stateObject)
 {
     SaveState(stateObject);
     await AdvanceActionWithState(state);
 }
 protected Task Error(IDeviceStateAction state) => _ = Task.Run(() => Controller.Error(state));
 protected Task Complete(IDeviceStateAction state) => _ = Task.Run(() => Controller.Complete(state));