public void TestRisingEdge()
        {
            //Test for A1 on rising edge of 0.5
            _test.Reset();

            var signal = new Signal()
            {
                Name = "A1"
            };
            var statement = new LogialAnalyzerTrigger.Statement.RisingEdge(signal, 0.5);
            var triggerStateForkedStatement = new TriggerStateForkedState(statement);

            triggerStateForkedStatement.AddTriggerStateThenOperations(TriggerStateThenOperations.Trigger);

            var triggerstate = new TriggerState();

            triggerstate.AddTriggerStateForkedStatement(triggerStateForkedStatement);

            var trigger = new Trigger();

            trigger.AddTriggerState(triggerstate);

            var engine = new TriggerEngine();

            engine.AddTrigger(trigger);
            engine.TriggeredUnitTest += engine_Triggered;

            engine.LogValueChange(signal, 0, DateTime.Now.Ticks);

            Assert.IsFalse(_test.WaitOne(10));

            engine.LogValueChange(signal, 1, DateTime.Now.Ticks);

            Assert.IsTrue(_test.WaitOne(10));
        }
        public async Task TriggerEngineRunsAndOnlyLogsAvailabilityOncePerSystemUponAvailableStateAsync()
        {
            var loggerFactory       = new TestLoggerFake();
            var environment         = new Mock <ICromwellOnAzureEnvironment>();
            var logger              = loggerFactory.CreateLogger <TriggerEngineTests>();
            var isStorageAvailable  = false;
            var isCromwellAvailable = false;

            environment.Setup(x => x.ProcessAndAbortWorkflowsAsync()).Returns(() =>
            {
                logger.LogInformation("ProcessAndAbortWorkflowsAsync");
                return(Task.CompletedTask);
            });

            environment.Setup(x => x.UpdateExistingWorkflowsAsync()).Returns(() =>
            {
                logger.LogInformation("UpdateExistingWorkflowsAsync");
                return(Task.CompletedTask);
            });

            environment.Setup(x => x.IsAzureStorageAvailableAsync()).Returns(() =>
            {
                logger.LogInformation("IsAzureStorageAvailableAsync");
                return(Task.FromResult(isStorageAvailable));
            });

            environment.Setup(x => x.IsCromwellAvailableAsync()).Returns(() =>
            {
                logger.LogInformation("IsCromwellAvailableAsync");
                return(Task.FromResult(isCromwellAvailable));
            });

            var engine = new TriggerEngine(loggerFactory, environment.Object, TimeSpan.FromMilliseconds(25), TimeSpan.FromMilliseconds(25));
            var task   = Task.Run(() => engine.RunAsync());
            await Task.Delay(TimeSpan.FromSeconds(2));

            isStorageAvailable  = true;
            isCromwellAvailable = true;
            await Task.Delay(TimeSpan.FromSeconds(2));

            isStorageAvailable  = false;
            isCromwellAvailable = false;
            await Task.Delay(TimeSpan.FromSeconds(2));

            isStorageAvailable  = true;
            isCromwellAvailable = true;
            await Task.Delay(TimeSpan.FromSeconds(2));

            var lines          = loggerFactory.TestLogger.LogLines;
            var availableLines = lines.Where(line => line.Contains("is available", StringComparison.OrdinalIgnoreCase)).ToList();

            Console.WriteLine($"availableLines.Count: {availableLines.Count}");

            foreach (var line in availableLines)
            {
                Console.WriteLine(line);
            }

            Assert.IsTrue(availableLines.Count == 4);
        }
Esempio n. 3
0
 public MainForm()
 {
     InitializeComponent();
     toolbar.Renderer = new ToolStripOverride();
     scriptEngine = new ScriptEngine();
     scriptBS.DataSource = scriptEngine;
     ScriptCurrentChanged(null, null);
     triggerEngine = new TriggerEngine();
     triggerBS.DataSource = triggerEngine;
 }
        public void TestStatemetnCollectionWithOneStatementComparingSignals()
        {
            //If: A1 == A2 && A2 < 5 Then: Trigger
            _test.Reset();

            var signal = new Signal()
            {
                Name = "A1"
            };
            var signal2 = new Signal()
            {
                Name = "A2"
            };

            var statement           = new LogialAnalyzerTrigger.Statement.Equals(signal, signal2);
            var statemetn2          = new LogialAnalyzerTrigger.Statement.LessThen(signal2, 5);
            var statemetnCollection = new LogialAnalyzerTrigger.Statement.StatementCollection();

            statemetnCollection.AddStatement(statement, LogialAnalyzerTrigger.Statement.LogicalOperators.First);
            statemetnCollection.AddStatement(statemetn2, LogialAnalyzerTrigger.Statement.LogicalOperators.And);

            var triggerStateForkedStatement = new TriggerStateForkedState(statemetnCollection);

            triggerStateForkedStatement.AddTriggerStateThenOperations(TriggerStateThenOperations.Trigger);

            var triggerstate = new TriggerState();

            triggerstate.AddTriggerStateForkedStatement(triggerStateForkedStatement);


            var trigger = new Trigger();

            trigger.AddTriggerState(triggerstate);



            var engine = new TriggerEngine();

            engine.AddTrigger(trigger);
            engine.TriggeredUnitTest += engine_Triggered;

            engine.LogValueChange(signal, 2, DateTime.Now.Ticks);
            engine.LogValueChange(signal2, 2, DateTime.Now.Ticks);

            Assert.IsTrue(_test.WaitOne(10));
        }
        public void TestForkedState()
        {
            //IF: A1 == 1 Then Trigger
            //ElseIF: A1 == 0 Then Trigger

            _test.Reset();

            var signal = new Signal()
            {
                Name = "A1"
            };

            var statement  = new LogialAnalyzerTrigger.Statement.Equals(signal, 1);
            var statemetn2 = new LogialAnalyzerTrigger.Statement.Equals(signal, 0);

            var triggerStateForkedStatement  = new TriggerStateForkedState(statement);
            var triggerStateForkedStatement2 = new TriggerStateForkedState(statemetn2);

            triggerStateForkedStatement.AddTriggerStateThenOperations(TriggerStateThenOperations.Trigger);
            triggerStateForkedStatement2.AddTriggerStateThenOperations(TriggerStateThenOperations.Trigger);

            var triggerstate = new TriggerState();

            triggerstate.AddTriggerStateForkedStatement(triggerStateForkedStatement);
            triggerstate.AddTriggerStateForkedStatement(triggerStateForkedStatement2);

            var trigger = new Trigger();

            trigger.AddTriggerState(triggerstate);



            var engine = new TriggerEngine();

            engine.AddTrigger(trigger);
            engine.TriggeredUnitTest += engine_Triggered;

            engine.LogValueChange(signal, 1, DateTime.Now.Ticks);

            Assert.IsTrue(_test.WaitOne(10));
        }
        public void TestEqualsToAnotherSignalNotInOrder()
        {
            //Test for A1 == 0
            _test.Reset();

            var signal = new Signal()
            {
                Name = "A1"
            };
            var signal2 = new Signal()
            {
                Name = "A2"
            };
            var statement = new LogialAnalyzerTrigger.Statement.Equals(signal, signal2);
            var triggerStateForkedStatement = new TriggerStateForkedState(statement);

            triggerStateForkedStatement.AddTriggerStateThenOperations(TriggerStateThenOperations.Trigger);

            var triggerstate = new TriggerState();

            triggerstate.AddTriggerStateForkedStatement(triggerStateForkedStatement);

            var trigger = new Trigger();

            trigger.AddTriggerState(triggerstate);



            var engine = new TriggerEngine();

            engine.AddTrigger(trigger);
            engine.TriggeredUnitTest += engine_Triggered;

            engine.LogValueChange(signal2, 0, DateTime.Now.Ticks);
            engine.LogValueChange(signal, 0, DateTime.Now.Ticks);

            Assert.IsTrue(_test.WaitOne(10));
        }
        public void TestTimeStatement3()
        {
            /*State1:
             * IF: Signal1 == 0
             * Then: 1. StartTimer 2.GotoNext
             *
             * State2:
             * If: Signal2 == 2 && Timer < 500ms
             * Then: Trigger
             * ElseIf: Timer > 500ms
             * Then: GotoFirst
             */
            _test.Reset();

            var signal = new Signal()
            {
                Name = "A1"
            };
            var signal2 = new Signal()
            {
                Name = "A2"
            };

            var statement = new LogialAnalyzerTrigger.Statement.Equals(signal, 0);
            var triggerStateForkedStatement = new TriggerStateForkedState(statement);

            triggerStateForkedStatement.AddTriggerStateThenOperations(TriggerStateThenOperations.StartTimer);
            triggerStateForkedStatement.AddTriggerStateThenOperations(TriggerStateThenOperations.GotoNextState);
            var triggerstate = new TriggerState();

            triggerstate.AddTriggerStateForkedStatement(triggerStateForkedStatement);

            var statement2 = new LogialAnalyzerTrigger.Statement.Equals(signal2, 2);
            var statement3 = new LogialAnalyzerTrigger.Statement.StatementTimeLessThen(500);
            var statement4 = new LogialAnalyzerTrigger.Statement.StatementCollection();

            statement4.AddStatement(statement2, LogialAnalyzerTrigger.Statement.LogicalOperators.First);
            statement4.AddStatement(statement3, LogialAnalyzerTrigger.Statement.LogicalOperators.And);
            var statement5      = new LogialAnalyzerTrigger.Statement.StatementTimeLargerThen(500);
            var foredstatement2 = new TriggerStateForkedState(statement4);

            foredstatement2.AddTriggerStateThenOperations(TriggerStateThenOperations.Trigger);
            var forkedStatemetn3 = new TriggerStateForkedState(statement5);

            forkedStatemetn3.AddTriggerStateThenOperations(TriggerStateThenOperations.GotoFirsState);
            var triggerstate2 = new TriggerState();

            triggerstate2.AddTriggerStateForkedStatement(foredstatement2);
            triggerstate2.AddTriggerStateForkedStatement(forkedStatemetn3);

            var trigger = new Trigger();

            trigger.AddTriggerState(triggerstate);
            trigger.AddTriggerState(triggerstate2);


            var engine = new TriggerEngine();

            engine.AddTrigger(trigger);
            engine.TriggeredUnitTest += engine_Triggered;

            //The time the first signal changes
            var firstSignalTimestamp = DateTime.Now.Ticks;

            // The trigger will jump to state two!
            engine.LogValueChange(signal, 0, firstSignalTimestamp);
            Assert.IsFalse(_test.WaitOne(10));

            // Signal 2 will change 600 ms after signal1
            engine.LogValueChange(signal2, 1, firstSignalTimestamp + 200);
            Assert.IsFalse(_test.WaitOne(10));
            engine.LogValueChange(signal2, 2, firstSignalTimestamp + 600);
            Assert.IsFalse(_test.WaitOne(10));

            // The trigger will jump back to state1 since the time excseeded 500ms
            engine.LogValueChange(signal, 2, firstSignalTimestamp);
            Assert.IsFalse(_test.WaitOne(10));

            //New time for the signal1 signalchange
            firstSignalTimestamp = DateTime.Now.Ticks;
            engine.LogValueChange(signal, 1, firstSignalTimestamp);
            Assert.IsFalse(_test.WaitOne(10));

            //New time for the signal1 signalchange //Will Jump to state2
            firstSignalTimestamp = DateTime.Now.Ticks;
            engine.LogValueChange(signal, 0, firstSignalTimestamp);
            Assert.IsFalse(_test.WaitOne(10));

            // Signal 2 will change 200 ms after signal1
            engine.LogValueChange(signal2, 2, firstSignalTimestamp + 400);

            Assert.IsTrue(_test.WaitOne(10));
        }
        public void TestSimpleTwoState()
        {
            //State 1: IF: A1 == A2 && A2 < 5 Then Goto Next
            //State 2: IF: A1 == 0 Then Trigger
            _test.Reset();

            var signal = new Signal()
            {
                Name = "A1"
            };
            var signal2 = new Signal()
            {
                Name = "A2"
            };

            //TriggerState 1
            var statement           = new LogialAnalyzerTrigger.Statement.Equals(signal, signal2);
            var statemetn2          = new LogialAnalyzerTrigger.Statement.LessThen(signal2, 5);
            var statemetnCollection = new LogialAnalyzerTrigger.Statement.StatementCollection();

            statemetnCollection.AddStatement(statement, LogialAnalyzerTrigger.Statement.LogicalOperators.First);
            statemetnCollection.AddStatement(statemetn2, LogialAnalyzerTrigger.Statement.LogicalOperators.And);

            var triggerStateForkedStatement = new TriggerStateForkedState(statemetnCollection);

            triggerStateForkedStatement.AddTriggerStateThenOperations(TriggerStateThenOperations.GotoNextState);

            var triggerstate = new TriggerState();

            triggerstate.AddTriggerStateForkedStatement(triggerStateForkedStatement);

            //TriggerState 2
            var statement3 = new LogialAnalyzerTrigger.Statement.Equals(signal, 0);

            var triggerStateForkedStatement2 = new TriggerStateForkedState(statement3);

            triggerStateForkedStatement2.AddTriggerStateThenOperations(TriggerStateThenOperations.Trigger);

            var triggerstate2 = new TriggerState();

            triggerstate2.AddTriggerStateForkedStatement(triggerStateForkedStatement2);



            var trigger = new Trigger();

            trigger.AddTriggerState(triggerstate);
            trigger.AddTriggerState(triggerstate2);


            var engine = new TriggerEngine();

            engine.AddTrigger(trigger);
            engine.TriggeredUnitTest += engine_Triggered;

            engine.LogValueChange(signal, 2, DateTime.Now.Ticks);
            engine.LogValueChange(signal2, 2, DateTime.Now.Ticks);
            // Will now jump to state 2
            Assert.IsFalse(_test.WaitOne(10));

            engine.LogValueChange(signal, 0, DateTime.Now.Ticks);

            Assert.IsTrue(_test.WaitOne(10));
        }
Esempio n. 9
0
        private string BuildInsertQueryV1(Guid itemId, string entityName, List <GroupedColumns> matchingColumns)
        {
            //create lower tables...
            Dictionary <string, string> executedTables = new Dictionary <string, string>();
            var query = "";
            var tablesWhoHasForeignKeyReference = matchingColumns.Where(t => t.NeedToUpdateColumn != null).ToList();

            if (tablesWhoHasForeignKeyReference.Any())
            {
                foreach (var table in tablesWhoHasForeignKeyReference)
                {
                    query += GetQueryStr(table);
                    StoreExecutedTables(executedTables, table);
                }
            }

            //create item table..
            var itemTable = matchingColumns.FirstOrDefault(t => t.EntityFullName.ToLower().Equals(ItemHelper.ItemClassName.ToLower()));

            if (itemTable != null)
            {
                query += GetQueryStr(itemTable);
                StoreExecutedTables(executedTables, itemTable);
            }

            //create other tables..
            foreach (var item in matchingColumns)
            {
                var clientName = (string.IsNullOrEmpty(item.ClientName)) ? item.EntityFullName : item.ClientName;
                var isExecuted = executedTables.Where(t => t.Key.Equals(clientName)).ToList();
                if (isExecuted.Any())
                {
                    continue;
                }
                query += GetQueryStr(item);
            }

            // add relateions
            foreach (var table in tablesWhoHasForeignKeyReference)
            {
                if (table.NeedToUpdateColumn == null)
                {
                    continue;
                }
                var columnWithValue            = new Dictionary <string, string>();
                UpdateQueryBuilder updateQuery = new UpdateQueryBuilder();
                columnWithValue.Add(table.NeedToUpdateColumn.ColumnName, table.Id.ToString());
                updateQuery.AddTable(table.NeedToUpdateColumn.TableName, columnWithValue);
                var targetRow = matchingColumns.FirstOrDefault(t => t.EntityFullName.ToLower().Equals(table.NeedToUpdateColumn.EntityFullName.ToLower()));
                if (targetRow == null)
                {
                    continue;
                }
                updateQuery.AddWhere(table.NeedToUpdateColumn.PrimaryKey, Comparison.Equals, targetRow.Id.ToString(), 1);
                query += updateQuery.BuildQuery();
            }

            IMetadataManager iMetadataManager = new MetadataManager.Contracts.MetadataManager();
            var triggers = iMetadataManager.GetTriggerProperties(entityName);

            if (triggers.Any())
            {
                var singletonTrigger = triggers[0];
                var bodyProp         = singletonTrigger.GetBody();
                var search           = matchingColumns.FirstOrDefault(t => t.EntityFullName.ToLower().Equals(entityName.ToLower()));
                if (search == null)
                {
                    return(TransactionHelper.BuildQuery(query));
                }
                {
                    var payload = bodyProp.Select(item => search.Columns.FirstOrDefault(t => t.FieldName.ToLower().Equals(item.ToLower()))).Where(matching => matching != null).ToDictionary <ColumnAndField, string, string>(matching => matching.ColumnName, matching => matching.Value);
                    if (!payload.Any())
                    {
                        return(TransactionHelper.BuildQuery(query));
                    }
                    var triggerEngine           = new TriggerEngine();
                    var triggerExecutionPayload = new TriggerExecutionPayload
                    {
                        PayloadObj       = payload,
                        ConditionalValue = itemId.ToString()
                    };
                    var triggerQuery = triggerEngine.GetQuery(triggers, triggerExecutionPayload);
                    if (!string.IsNullOrEmpty(triggerQuery))
                    {
                        query += triggerQuery;
                    }
                }
            }
            //------------
            return(TransactionHelper.BuildQuery(query));
        }